C语言数组指针问题。
本帖最后由 NSE 于 2015-2-6 15:11 编辑#include <stdio.h>
#define f "%d,%d\n"//宏
int main()//主
{
int a={1,3,5,7,9,11,13,15,17,19,21,23};//定义二维数组
printf(f,a,*a);//输出a的地址,输出a的地址
printf(f,a,*(a+0));//输出a的地址,输出a的地址
printf(f,&a,&a);//取出a的地址,取出 a 行 列首地址
printf(f,a,a+1);//输出 a一行 0列地址,输出a一行 0列地址
printf(f,&a,*(a+1)+0);//输出a一行 0列地址,输出a1行0列地址
printf(f,a,*(a+2));//输出2行 0列地址,输出2行0列地址
printf(f,&a,a+2);//取 2行0列地址,取2行地址
printf(f,a,*(*(a+1)+0));//值为9,值为9
return 0;
}我写的注释部分和 书本写的不一样 怎么去 运用指针到多维数组和数组上?
数组和多维数组在内存上的概念我理解 就是用指针表示 理解没透彻。
只要理解内存怎么存的就ok了,指针只是一种表示方法,不行就换一个方式 百日维新 发表于 2015-2-5 17:23
只要理解内存怎么存的就ok了,指针只是一种表示方法,不行就换一个方式
你说的好轻松。。。你来表示下 NSE 发表于 2015-2-5 17:43
你说的好轻松。。。你来表示下
{:7_121:}你知道的,我还是菜鸟....
内存模型
1,1375884
3,1375888
5,1375892
7,1375896
9,1375900
11,1375904
13,1375908
15,1375912
17,1375916
19,1375920
21,1375924
23,1375928
前面是数,后面是地址:我们看到了 地址之间相隔4个字节。因此内存地址是线性的,在内存中都当做一维数组。
int a={ {1,3,5,7}, {9,11,13,15}, {17,19,21,23}}; //最好写成这样,增加可读性。
printf("%d %d \n",a,*(*(a+1)+0));
*(*(a+1)+0) : a是地址( int (*)[] 类型,指向二维数组第一维),a+1就是数组第一维 (a)+ 偏移地址1 —— > a (int (*)[]类型)
* (a+1)*号 将 a+1的地址解引用变成 int* 类型的值a
*(int* 值 + 0)这个值在偏移0,之后解引用,变成一个int值。
个人理解,请勿轻信,我也是没理解透,总是找不到逻辑,各种书上写的不知哪个对{:7_121:}
导师,求正确答案 @仰望天上的光
#include <stdio.h>
#define f "%d,%d\n"//宏
int main()//主
{
int a={1,3,5,7,9,11,13,15,17,19,21,23};//定义二维数组
for(int* p = a;p < a+12;p++)
{
printf(f,*p,p);
}
return 0;
} NSE 发表于 1 小时前static/image/common/back.gif
引用: 百日维新 发表于 2015-2-5 17:23
只要理解内存怎么存的就ok了,指针只是一种表示方法,不行就换一个方式
你说的好轻松。。。你来表示下...
用数组代替,学计算机最忌讳就是钻牛角尖,太深太多你不可能学完的,工作需要什么就学什么 我们可以把
int a理解为定义了一个"变量"它是一个数组,有3个元素,每个元素的类型为int ;
干脆这样定义看的更清楚:
typedef int Vec;
Vec a;//等价于int a;
又,从形式上看, *(a+n)等价于a
所以:
printf(f,a,*a);中,输出的数组a退化为数组a首元素的指针(类型为int(*)即Vec*),*a等价于*(a+0)也就是a
这是一个类型为Vec的数组,它退化为该数组手元素的指针(类型为Vec),这里输出的两个数值相同,但数据类型不同。
printf(f,a,*(a+0));这里*(a+0)同上面的*a,不解释
printf(f,&a,&a);
这里,a就是*(a+0),所以&a,就是&*(a+0),也就是 a+0,也就是a前面解释过。
&a中,a是*(a+0),&a就是&*(a+0),就是a+0,也就是a,前面也解释过
printf(f,a,a+1);中
a就是数组a 的第一个元素,前面定义了数组a为 Vec a;所以 &a = &a + sizeof(Vec),其中,sizeof(Vec)=sizeof(int) * 4。 前面说过,&a的值和a相同(类型不同),所以这个值自己可以算出来。
a+1等价于&(*a+1)也就是&a,这个值和a相同(类型不同)
OK,剩下的自己推导吧。。。这里的思想精华是:不要管什么多维数组,统统看成Typea; 取出元素后再看Type是什么类型。 仰望天上的光 发表于 2015-2-6 10:40
我们可以把
int a理解为定义了一个"变量"它是一个数组,有3个元素,每个元素的类型为int ;
干脆 ...
谢啦。导师
页:
[1]