C语言指针问题?

char a[][20]={"acde","wefg","wetgdf"};
char **p;
p=a;
这个a是行的地址,也就是a是指向a[i]这一行的指针,a[i]存储的也是一个地址,指向列,那不就是a是指向指针的指针,为什么不能把a赋值给char **p?

你好,二者并不等价, 首先我们知道,a[i]是指向一个有20个char元素的char数组 而p是指向指针的指针
我们可以来分析啊 当你 p=a 时, p即a[0] [0] 的地址 此时你*p 即为取出a[0] [0] 的内容即为'a', 而当你 **p 的时候 就出错了, 这时候你就是在对 ‘a’ 这个字符取地址,这时候就会出现内存异常错误,你肯定是不能对97取地址。你可以强制转换赋值然后自己试一下 即可
p = (char **)a;追问

可否这样理解,char a[][i]的a是指向一个行,这个行下面还有好多个元素,char**p是一个元素的地址

追答

其实你对地址不了解 所谓的二维数组 在内存里也是线性的 a[0] 和 a[0][0] 的地址是同一个 而不管他是什么 指针的*就是取出地址里的内容 你只要理解为指针指向的地址 取出来的内容就是字符串a 而你二级指针再对a取内容就错了 因为a只是一个字符并不是地址

p就是一个指向 指针的指针 就是一个指针里面存放的内容是另外一个指针的地址 这样你**p时内容才是正确的

追问

明白了,两个东西虽然都是地址,但是地址不是同一个类型

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-06-27
数组名可以看作指针,但是和指针又是有区别的,网上有很多例子,本身将数组名赋值给指针也是做了隐式的转换。编译报错已经说明了原因,cannot convert ‘char [3][20]’ to ‘char**’,编译器认为两种指针的类型不同,所以无法赋值。对于二维数组应该定义指向数组的指针来使用char (*p)[20],多维数组同理,可以当做是语法规定本回答被网友采纳
第2个回答  2020-06-27
公司额u额u五我IEUR就金额居然就三级濡染有呀让他估计他忽然呵呵哈手机额吉手机忘记

C语言指针问题?
调用结束后,所有实际参数的值均不会发生变化。但是swap3中*pa,*pb发生的交换(实际就是主函数中a和b的值发生了交换)

C语言中的指针问题到底是怎么回事~
指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。 指针所指向的内存区和指针所指向的...

C语言指针问题
则表达式 *y+2的值是'5' 。分析:y是字符串数组首元素'3'的地址,*y的值就是字符'3',再加上2,就是字符'5'(也可以说是字符'5'的ASC码值)。二、 如有定义char z[2][4]={"MAT", "LAB"};,则表达式*(*z+2)的值是 'T'。分析:z是二维字符串数组首字符串“MAT”的地址,*z...

C语言指针问题。
(1) ++(*pointer)是先取值,再自增,当前pointer指向的是位置arr[3],取值后是2,*pointer的结果是2,2再自增,当然会得出3。值得说明的是,这个括号是可以省略的,此处括号只起到增加程序可读性的作用。(2)*(pointer-2)是先移动指针,再取值。pointer-2是把指针从当前位置arr[3]回退两...

c语言指针的赋值问题
在C语言中,指针是一个变量,其特殊之处在于它存储的是其他变量的地址,而不是值本身。指针使我们能够间接地访问和修改变量的值。指针的赋值过程 当我们为指针变量赋值时,实际上是将其指向一个变量的内存地址赋给它。这个过程分为两步:首先确定变量的地址,然后将这个地址赋给指针变量。例如,如果我们...

c语言指针问题
你也可以理解: p=*s; 即 p= *(s+0); 即 p=s[0]; p=&s[0][0];p 有了字符\/字符串存放空间。答案是一条一条判断的。它们与 p=*s 并无直接关系,只是考学生对char * 语法和char 地址计算的理解。例如: scanf("%s",*(*(p+1)+0)); 是错的,参数应当是 char 地址...

C语言指针问题
变量之间互相赋值是正确的。“原因是被赋值的指针变量前不能再加*说明符”这句话的意思是:如果 给 指针P加上“*”,那么它就变成 了变量,代表的意义就变了,而地址只能赋值给指针不能给变量。最后建议学习看书一定要读国外原著,国内翻译或作者的理解或描述,未必就是正确和合适的。

C语言指针问题
1.概念问题:指针是指存放地址值的变量或常量;指针与一般变量或常量的区别,在于它不直接存储数值,而是存放被存储数值的地址,属于间接存放,所以不少初学者感觉学习困难。 比如:int a=2,b,c,*ptr; ptr=&a;表示将指针ptr指向变量a,存放a的地址,假设是2000H,而指针变量ptr本身也要有地址,...

C语言指针的赋值问题
p为指针,地址是未知的,如果直接赋值 p=a;这样编译可以通过,但是会产生警告,p的地址是随机分配的,这样对未知的地址赋值很危险,可能会覆盖掉某些重要数据,所以避免这种危险,在定义指针时注意初始化,也就是赋值。可以int*p=&a;或者int*p;p=&a;然后再对p进行操作 有错。注意大小写,还有 inta...

c语言问题,关于指针的问题
一、比如我们定义一个int型指针变量。int *p=NULL;初值为空。那么当执行while(p);时,只有p==NULL时,while循环才会结束。所以如果我们写while(p);printf。。。;那么只有当p为空时,后面的printf才会执行。否则就一直循环,这样我们就能判断p为空了。同理!p,自然就能判断p不为空了。二、p...

相似回答