求跳大神科学解释解释一下C语音中指针&*a与*&a的区别,用直白点的话解释,书上的理解不了

C程序:为什么加上char (*p4)[5] =这句后编译出错,请教char (*p4)[5]=a;与char (*p4)[5]=&a;有什么区别 - C语言当前位置:& &&&C程序:为什么加上char (*p4)[5] =这句后编译出C程序:为什么加上char (*p4)[5] =这句后编译出错,请教char (*p4)[5]=a;与char (*p4)[5]=&a;有什么区别&&网友分享于:&&浏览:22次C程序:为什么加上char (*p4)[5] =这句后编译出错,请问char (*p4)[5]=a;与char (*p4)[5]=&a;有什么区别?#include &stdio.h&void main(){ char a[5] = {'A','B','C','D','E'}; char (*p3)[5] = &a; //char (*p4)[5] = printf(&p3+1 = %x \n&,p3+1); //pritnf(&p4+1 = %x \n&,p4+1);}------解决方案--------------------char (*p3)[5] = &
//&a的类型是 char(*)[5]//char (*p4)[5] =
//a的类型是 char *
------解决方案--------------------首先,指出一个问题:char a[5] = {'A','B','C','D','E'};应该改为:char a[5] = &ABCD&;或者char a[5] = {'A','B','C','D','\0'};至于为什么,想必你懂的。然后,说主要问题: char (*p4)[5]的意思是p4是一个指针,起指向为包含5个元素的数值,和char*是完全不同的!p4++指向的并不'B',而是a[4]之后的那个地址!经常碰见的情况是这样: char b[2][3]={&AA&,&BB&}; char (*bp)[3]=b; bp++; printf(&%s&,*bp);//得出的是&BB&,而不是'A'。 &&
a的意思与&a[0]的意思相同,也就是a[0]的地址,是(char*)类型,可以这样 char* px = a 或者 char* px = &a[0],但不能是char (*px)[5]=a。 而&a指的是a[5]的地址,也就是数组的地址,其类型是和p4相匹配的,因而可以进行赋值。要记住,a和&a虽在数值上是相同的,但是完全是不同的概念,很多书上混淆了他们的概念,我认为是不正确的。&
&有点困,发了才发现有几个地方写错了,重发下
------解决方案--------------------简单的说:首先你的定义的p3,P4都是指向数组的指针,直接用a,它转化为指向字符的指针,用&a才是数组的地址
------解决方案--------------------探讨char (*p3)[5] = & //&a的类型是 char(*)[5]//char (*p4)[5] = //a的类型是 char *
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有其实这两个东西挺难理解的,应该也没有那么重要,了解一下好了,主要还是要多多理解数组指针的运算
最近又把学习c语言提上日程上来了~~~先把我打算看的书都写下来吧,&C语言深度剖析&,&c和指针&系类,&c语言陷阱和缺陷&
先说说a和&a的区别(有三点,三个方向):1.是a和&a的本质,都是什么类型的。2.从2维数组的角度看。3.从指针运算的角度看。
声明:虽然数组名不是指针,但是用的很像指针,我们暂且把它叫做一个指针吧。
第一个问题:int a[10];& a ,&a和&a[0] 都是分别是什么?先说明a ,&a和&a[0]三个值是的相等哈。
a叫做数组名,是数组首元素的地址,也就是&a[0]的值。像是一个指针类型,是一个int型的指针类型,int *,先理解成指针吧。
&a这才是一个真正的指针,是一个数组指针。是数组的地址。
切记:&a不是指向指针的指针,因为&a和a的值相等,但是*&a和*a的值不相等。*&a和a的值一样,说明*&a仅仅是对这个数组指针进行了取值,取得的是数组的值,即数组首元素的地址,而不是对&a这个地址进行了取值。这个应该是c语言中针对数组指针运算的规定。&这里的数组指针&a取值之后,变成了a,是a,不是*a,变成了这个数组的数组名,或者说是数组首元素的地址。
我做了如下实验:
#include&stdio.h&&int main()&{&&&&&&&& int a[5]={1,2,3,4,5};&&&&&&&& printf("a=%x\n",a);&&&&&&&& printf("&a=%x\n",&a);&&&&&&&& printf("*(int*)&a=%x\n",(*((int *)(&a))));&&&&&&&& printf("*&a=%x\n",(*(*(&a))));&&&&&&&& printf("&a[0]=%x\n",&a[0]);&&&&&&&& printf("*&a[0]=%x\n",*(&a[0]));&&&&&&&& return 0;&}
printf("*(int*)&a=%x\n",(*((int *)(&a))));
这句没有像常规的一样对&a进行取值,而是强制类型转换了一下,可见这个不是一个指向指针的指针。&第二个问题:二维数组中的利用指针来遍历的方式,也不是一个指向指针的指针(2级指针) ,这句printf("%d\n", *(*(a+i) + j));&&*(a+i)也就是将数组指针取值获得数组的首元素地址,常常的误区就是数组指针的取值运算和普通的指针取值运算不一样。数组指针取值运算类似一个强制类型转换的过程。&&&&
注意:二维数组的数组名a,是第一个一维数组的数组指针,*a就是第一个一维数组的数组名。也可以直接用tpye *强制类型转换。
&#include &stdio.h&&int main(int argc, char* argv[], char* env[])&{&&& int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};&&& int i = 0;&&& int j = 0;&&& for(i=0; i&3; i++)&&& {&&&&&&&& for(j=0; j&3; j++)&&&&&&&& {&&&&&&&&&& //& printf("%d\n", *((int *)(a+i) + j));&&&&&&&&&&&&&&&&& printf("%d\n", *(*(a+i) + j));&&&&&&&& }&&&& }
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:29940次
积分:1024
积分:1024
排名:千里之外
原创:117篇
转载:12篇
(1)(6)(5)(1)(2)(4)(1)(6)(3)(2)(10)(1)(27)(5)(55)(1)发表内容请遵守中国之法律法规 公安备案编号:0
网友发布或转载自互联网的内容,纯属个人行为,与本网站立场无关
内容所述观点仅代表发帖对象之观点,真实性炫浪网无法查证,特此声明}

我要回帖

更多关于 跳大神科学解释 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信