NSE 发表于 2015-2-5 14:47:56

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;
}我写的注释部分和 书本写的不一样 怎么去 运用指针到多维数组和数组上?
数组和多维数组在内存上的概念我理解 就是用指针表示 理解没透彻。

百日维新 发表于 2015-2-5 17:23:14

只要理解内存怎么存的就ok了,指针只是一种表示方法,不行就换一个方式

NSE 发表于 2015-2-5 17:43:57

百日维新 发表于 2015-2-5 17:23
只要理解内存怎么存的就ok了,指针只是一种表示方法,不行就换一个方式

你说的好轻松。。。你来表示下

拈花小仙 发表于 2015-2-5 19:26:12

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:}

导师,求正确答案 @仰望天上的光








拈花小仙 发表于 2015-2-5 19:27:40

#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;

}

百日维新 发表于 2015-2-5 19:33:16

NSE 发表于 1 小时前static/image/common/back.gif
引用:   百日维新 发表于 2015-2-5 17:23   
只要理解内存怎么存的就ok了,指针只是一种表示方法,不行就换一个方式
你说的好轻松。。。你来表示下...

用数组代替,学计算机最忌讳就是钻牛角尖,太深太多你不可能学完的,工作需要什么就学什么

仰望天上的光 发表于 2015-2-6 10:40:05

我们可以把
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是什么类型。

NSE 发表于 2015-2-6 15:11:58

仰望天上的光 发表于 2015-2-6 10:40
我们可以把
int a理解为定义了一个"变量"它是一个数组,有3个元素,每个元素的类型为int ;
干脆 ...

谢啦。导师
页: [1]
查看完整版本: C语言数组指针问题。