用指向数组的指针时 出现错误,怎样解决。。。。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用指向数组的指针时 出现错误,怎样解决。。。。相关的知识,希望对你有一定的参考价值。
#include<iostream.h>
#include<string.h>
void sort(char (*p)[20],int n)
int max;
for(int x=0;x<n-2;x++)
for(int y=1;y<n-1;y++)
if(strcmp(*(p+x),*(p+y))>0)
max=x;
x=y;
y=max;
*(p+max)=*(p+x);
*(p+x)=*(p+y);
*(p+y)=*(p+max);
void main()
int n;
cout<<"请输入要排序的字符数组个数:";
cin>>n;
char a[50][20],*p[50];
int i;
for(i=0;i<=n;i++)
p[i]=a[i];
for(i=0;i<=n;i++)
cin.getline(p[i],20);
sort(a,n);
for(int j=0;j<=n;j++)
cout<<a[j]<<'\n';
、、、、、、、、、、、、、、
(p+max)=(p+x);
(p+x)=(p+y);
(p+y)=(p+max);
程序编译时,总是出现“left operand must be l-value”应该怎么解决。(*p)[10]到底属于什么类型。不好用
2、main中的循环for(int j=0;j<=n;j++),这个不对,应该没有等号,要不然要多一次循环
由于输入n后回车的问题可以在之前就把这个回车符干掉
3、sort中的y值应该从x+1开始,而且结果条件少了一个等号,你想啊,输入3个数的话,n-2为1,条件为 x<1 你写的程序只能比较一次,3个字符串如何一次能比较出结果?
4、直接给你贴上程序
void sort(char (*p)[20],int n)
for(int x=0;x<=n-2;x++)
for(int y=x+1;y<=n-1;y++)
if(strcmp(*(p+x),*(p+y))>0)
char tmp[20] = 0;
strcpy((char*)tmp, (char*)(*(p+x)));
strcpy((char*)(*(p+x)),(char*)(*(p+y)));
strcpy((char*)(*(p+y)),(char*)tmp);
int main()
int n;
char tmp[20];
char a[50][20],*p[50];
int i;
cout<<"请输入要排序的字符数组个数:";
cin>>n;
cin.getline(tmp,20);
for(i=0;i<n;i++)
p[i]=a[i];
for(i=0;i<n;i++)
cin.getline(p[i],20);
sort(a,n);
for(int j=0;j<n;j++)
cout<<a[j]<<'\n';
system("pause");
return 0;
参考技术A (char (*p[20]))中,p是一个指向数组的指针,这个数组中有20个 char 元素,既然p是指针的话,那么(p+max)
(p+x)
(p+y)都是地址,计算机中地址都是4个字节的,这样就相当于把p指向了一个int类型的数,而且(p+max)=(p+x);
(p+x)=(p+y);
(p+y)=(p+max);
这几个语句只是地址之间的运算,不是传递指针所指的数,这句话的意思应该是左边应该是数,因为这几个语句左边都是地址,关于指针的真正意思,你可以去看看一本叫做C专家编程的书,里面有一节叫做“编译器喜欢的语法”,详细讲解编译器是怎样识别指针的,对你有用,我有PDF,要的话CALL我 参考技术B (*p)[10] 是一个指向二维数组的指针,其中第二维必须是10, 第一维随便。
所以如果有定义:
char (*p)[10];
char ch1[3][10], ch2[4][10], ch3[3][20];
则:
p= ch1; //正确
p=ch2; //正确
p=ch3; //错误 参考技术C (*p)[10],是个指针,指向一个有10个元素的数组,修改过的代码如下,运行成功...
#include<iostream.h>
#include<string.h>
void sort(char *p[],int n) //应该定义为指针数组,因为其中存放的是字符数组的地址
for(int x=0;x<n-2;x++)//max没有用到,所以,不用定义
for(int y=1;y<n-1;y++)
if(strcmp(*(p+x),*(p+y))>0) //x,y的值不用交换,只要交换*(p+x);*(p+y);他们都是指向一个一位数组的,你的程序中max的值为x(已经和y交换了),很明显,如果x,y已经交换过一次了,再交换也没有什么用了
char *i;;定义一个指针型的中间变量
i=*(p+x);
*(p+x)=*(p+y);
*(p+y)=i;
void main()
int n;
cout<<"请输入要排序的字符数组个数:";
cin>>n;
char a[50][20],*p[50];
int i;
for(i=0;i<=n;i++)
p[i]=a[i];//对字符指针数组赋值
for(i=0;i<=n;i++)
cin.getline(p[i],20);//输入要比较的字符数组
sort(p,n);//必须用p,不能用a
for(int j=0;j<=n;j++)
cout<<a[j]<<endl;
不过不能实现排序的功能,可能是子函数编的有问题
修改指向指针的数组中对应元素的字符出现异常,该如何解决?
在调试C语言程序时遇到的情况
指向指针的数组定义如下:
char * msg[5] =
" Thank you for the wonderful evening, ",
"You certainly prove that a ",
"is a special kind of guy. We must get together",
"over a delicious ",
" and have a few laughs"
;
然后定义了一个指向char*类型的指针:
char* *pt=msg;
当我想用下面语句修改字符串其中一个字符时出现异常:
**pt='K';//编译没错误,但运行出现异常
就是将msg[0]元素的第一个字符修改为k时出现的异常,整体修改数组元素就没有任何问题
譬如:*pt="fajlgjalhglajlg";//运行正常
" Thank you for the wonderful evening, ",
"You certainly prove that a ",
"is a special kind of guy. We must get together",
"over a delicious ",
" and have a few laughs"
;
这句话定义了一个指针数组,该数组里面有5个指针,仅仅是指针,而没有分配任何的内存空间给它们,而所谓的赋值,只是把这5个常量字符串的首地址赋给了这5个指针变量,也就是说赋值让该指针数组的5个成员分别指向了5个常量字符串
我们知道,常量所在的空间地址是系统分配,上面的内容不允许更改,因此你想改变常量的值,当然会非法。
而对于*pt="fajlgjalhglajlg";这句代码来说,就是改变了指针的指向而已,让它指向了另外一个常量的地址,当然可以成功
记住,指针没有分配空间的时候,任何修改值的操作都是相当危险的!!!
如果分配了内存,赋值就不会出问题,请参考以下代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
int i=0;
char * msg[5];
char* *pt=msg;
msg[0] = (char *)malloc(100);
strcpy(msg[0], " Thank you for the wonderful evening, ");
**pt='K';
参考技术A .(SP)=0063H
因为SP是堆栈指针寄存器,它始终指向栈顶元素。这里要注意的一点是,堆栈定义以后,所谓的栈顶位于该段的低地址端。如果定义的堆栈的大小是64H个字节,那么段内偏移量的范围就在0000H到0063H之间,所以当堆栈为空时,(SP)=0063H。
2.因为你定义的堆栈是字类型的,故大小为32H×2=64H个字节,所以:
当堆栈为空时,(SP)=0063H,理由同上面一样;
当堆栈为满时,(SP)=0000H,原因就不用我说了吧!
不知道我说的到底对不对,仅供参考!!本回答被提问者采纳 参考技术B 实际上指针只能指向变量,但有一个特例:那就是指针可以指向一个字符串.而此时呢这个字符串是一个文字常量,也即就是默认的const型常量.所以是不能修改其里面的值得,那么为了避免这种编译不报错,但运行时却出错的情况,一般在定义指针的时候就需要在前面加上const。。。。。。。。。 参考技术C **pt指向的是常量,不能修改.
#include <stdio.h>
int main()
char msg[5][50] = " Thank you for the wonderful evening, ", "You certainly prove that a ", "is a special kind of guy. We must get together",
"over a delicious ", " and have a few laughs" ;
char* pt = msg[0];
*pt = 'K';
printf("%s\n", msg[0]);
return 0;
以上是关于用指向数组的指针时 出现错误,怎样解决。。。。的主要内容,如果未能解决你的问题,请参考以下文章