C语言指针数组问题 求高手详解
作者&投稿:豫茂 (若有异议请与网页底部的电邮联系)
*(a[i]+j)
*(*(a+i)+j)
(*(a+i))[j]
你的题目有点问题“若有int a[10];*p=a;”『10』这后面应该是逗号吧,如果逗号的话:
选择 C
题目可以看成int a[10]和int*p=a,这样p就是a[0]的地址,p++可以看成p+1,这样p指向下一元素,即a[1]的首地址。
语句
if(k<3) p[k]=m+2*k*k;
的计算过程序,当k=0时,p[0]=m也就是指针p[0]指向的是数组m的开始
当k=1时,p[1]=m+2;因此p[1]指向m+2的位置,也就是从数字4开始的位置
当k=2时,p[2]=m+8;因此p[1]指向m+8开始的位置,也就是&m[8]开始的位置,即数组m中的第9个元素的地址,也就是16
再来看for中循环语句中的指针表达式,首先下标运算符p[k]是与*(p+k)等价的,
(*(p+k))[4-k];
=(p[k])[4-k]
=*(p[k]+4-k) //注意这一步,不能把括号折开来算,而应按p[k]与*(p+k)等
价的替换来计算,不然在某些地方会出错。
=*(&p[k][0]+4-k) //在计算地址相加时,应把p[k]这样的式子转换为前面带有
&地址运算符的表达式才能直接相加,否则会出错,因为
p[k]就是指的p[k][0]的地址,因此应这样换算
=*(&p[k][4-k]) //这里就可以地址直接相加了
=p[k][4-k] //这是最后结果。
上面的计算如果你的理解能力强,你也可以用文字去描术,什么指针偏移多少个单位,又指向哪里,这样来描术,但本人认为文字描术容易出错,因此采用数学的计算方法,科学,安全,不易错。
再来看p[k][4-k]究竟是什么,
当k=0时,就是p[0][4-0]因此,因为p[0]是指向的数组m的开始,因此p[0][4]就是指的数组中下标为4的元素,也就是8
当k=1时,就是p[1][4-1]=p[1][3],因为p[1]是指向的数组m+2以数字4开始的位置,因此p[1][3]就是指的从4的位置起(4的下标对于指针p[1]来讲为0),向后的下标为3的位置的元素,也就是10
当k=2时,就是p[2][4-2]结果就是m+8开始的下标为2的元素的值,就是20
因此最后sum的值是8+10+20=38
值 : 0 2 4 6 8 10 12 14 16 18 20 22
数组:m[0] m[1] m[2] m[3] m[4] m[5] m[6] m[7] m[8] m[9] m[10] m[11]
指针 p[0] p[1] p[2]
以上是参考图,先解释一下,首先p[k]=m+2*k*k ,m是数组首地址m+2*k*k 相当于m[2*k*k],一次将地址付给p[3],p[0]指向m[0],一次类推。p[3]为指针数组,也就是说数组每个元素都是一个指针。
现在解释 sum+=(*(p+k))[4-k];(p+k)相当于p[k].(*(p+k))[4-k];在p[4]的基础上向后面移动(4-k)步指针。例如 (*(p+0))[4-0];相当于p[0]所指的m[0]向后移动4步到m[4]为8 。依次类推,sum=8+10+20=38
希望能帮助你!
军垄乳酸: 首先你要明白一点,数组名和指针本质上是一回事,都是地址,该数组的首地址.知道这一点后就可以活学活用了.这是c语言的精髓.比如你定义了int *p,a[10];并且让p=a;, 这个操作叫做指针p指向了数组a,其本质是给p这个变量付了一个...
怀远县18485618745: C程序指针数组问题 - ?
军垄乳酸: 把你的问题具体点说:char* p[2 ]和char (*p)[2 ] 无非是指针数组和数组指针的理解:1、先看char* p[ 2] 由于*是自右向左结合的,所以首先它是一个数组,然后是char*类型的,所以char* p[ ]是一个存放指针类型的数组(即:存放char类型变量的地...
怀远县18485618745: C语言,指针数组问题?
军垄乳酸: 首先,你必须明确指针是存放地址的哦!指针数组每个元素都是指针,具体用法,不用我说了吧! 我直接举一个例子! int arr[5]; for(int i = 0 ; i < 5; i++)scanf("%d",&arr[i]); int *p_array[5]; for(int i = 0; i < 5; i++)p_array[i] = &arr[i];
怀远县18485618745: 关于c中的指针字符串数组嘎,刚学c,求高手指教啊 - ?
军垄乳酸: 这问题简单:例 strcpy(p[0],"数学") printf("%s\n",p[0]); 输出数学,这个你应该明白.char *p[3]; p[0]="数学";这里的的先定义一个指针数组,强调是一个数组,3个元素,每个元素都是一个指针,p[0]是一个指针 p[0]="数学" 把一个字符...
怀远县18485618745: C语言指针数组问题 - ?
军垄乳酸: char *a={"abc"}; a 是指针.char c[]={"abc"}; c 是数组.初始化后 sizeof(a) 为 4,strlen(a) 为3.同样,sizeof(c) 为 4,strlen(c) 为3.在语句中有时一样,有时不一样.例如:char *a={"abc"}; char c[]={"abc"}; char b[]={"123"}; int L; L = ...
怀远县18485618745: 求C语言高手指点:请问如何指针定义二维数组?? 请用 **p ,(*P)[ ] ,*p[ ] 三种来进行指针定义 - ?
军垄乳酸: int a[4][5],*p[4],i; //p表示指针数组 for( i=0;i<4;i++ )p[i]=a[i]; /*有了这个定义后,指针数组p中的每一个指针分别指向了二维数组a每一行的首地址,以后通过p就可以访问a */ 访问格式:p[i][j] , (*(p+i))[j] , *(*(p+i)+j) , *(p[i]+j) 都表是a[i][j] eg: p[1][1]=1...
怀远县18485618745: C语言数组与指针的问题?
军垄乳酸: 我先回答的你第一个问题,首先,for循环的作用是为将字符串ch的两个字串的地址赋给指针数组p[i], ch[i]代表的是数组名常指针可以直接给指针赋值,所以p[1]=ch[1],就是使p[1]指向字串"6937"的首地址,p[2]=ch[2]就是将字串"8254"的首...
怀远县18485618745: C 语言关于引用指针数组的问题,高手帮忙看下问题在哪 - ?
军垄乳酸: 字符串数组不是这么用的.比如1月应该这样strcpy(month[0],"January ");pm的类型要改成(char *) pm[10]#include #include "strin...
怀远县18485618745: 关于C语言数组指针的一个问题,高手进! - ?
军垄乳酸: 楼主,你的理解有误 char *s[],表示:s是个数组,这个数组里存的是char型指针. 这样应该好理解些: typedef char* cp;//cp 是char* 类型的 下面,用cp定义数组,定义...
怀远县18485618745: C 语言 数组和指针的问题?求解决?
军垄乳酸: 答案:B 分析:指针就变量p取得数组a的首地址,由指针与数组关系知,p[i]表示数组元素第i+1元素值,p[i]=a[i]正确,故A不能选.*(a+i)表示一维数组a第i+1元素值,*(*(a+i)表示对第i+1元素值再取值是错误操作,所以选B.a[p-a]=a[0]正确,故不能选择C.*(&a[i])也正确(见上题),也不能选D.