用指向数组的指针时 出现错误,怎样解决。。。。

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]到底属于什么类型。不好用

1、字符串的复制不能用等号的啊,要用strcpy:strcpy(*(p+max), *(p+x));
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";//运行正常

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"
;
这句话定义了一个指针数组,该数组里面有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;

以上是关于用指向数组的指针时 出现错误,怎样解决。。。。的主要内容,如果未能解决你的问题,请参考以下文章

C指针:指向一个固定大小的数组

(。??)ノ~java常见错误

程序的错误输出,使用指向结构数组的指针

修改指向指针的数组中对应元素的字符出现异常,该如何解决?

添加指向数组的指针时出现分段错误

二维数组和指向指针的指针