鱼C论坛

 找回密码
 立即注册
查看: 3286|回复: 6

我有一個很大的問題 開於二維數組 與 指針

[复制链接]
发表于 2012-4-18 03:58:01 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 kalong1272002 于 2012-4-18 05:03 编辑

  1. #include<stdio.h>
  2. main(){
  3.     int (*ptr)[3];
  4.     int i , j;
  5.    
  6.     int ax[3][3] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
  7.     ptr =ax;
  8.     for(i=0;i<3;i++)
  9.     {
  10.         for(j=0;j<3;j++)
  11.      {
  12.       
  13.          printf("%2d ",*(*(ptr+i)+j);
  14.      }
  15.          printf("\n");

  16.     }
  17.     system("PAUSE");
  18. }
复制代码


根據小甲魚所說*(*(ptr+i)+j)) 是讀取的方法
這是我第一個不明白的地方  
*(ptr+i) 當我嘗試這樣打的時侯 "*" 為什麼不是取值的作用 而是把ptr+i的地址print了
我要打**(ptr+i)才能print數值, 為什麼呢?? 不是*(ptr+i) 是取值嗎, 還是2D數組有別的看法
是否與(*ptr) 有關呢?

然後 我第二個不明白的地方是
*(ptr+i)+j

經過一晚的思量 得出以下結果 不知道是否正確 請高手指點,

        //由於一開始ptr 指住&ax[0]
        //然後*(ptr+0)+j 把ptr+  0 = &ax[0]+0 然後ax[0] + 0 ...+1...+2(把內存位置推過12byte)即是ax[0][0],ax[0][1],ax[0][2]
        //然後*(ptr+1)+j 把ptr + 1 = &ax[0]+1 然後ax[1] + 0 ...+1...+2(把內存位置推過12byte)即是ax[1][0],ax[1][1],ax[1][2]
         //然後*(ptr+2)+j 把ptr + 2=  &ax[1]+2 然後ax[2] + 0 ...+1...+2(把內存位置推過12byte)即是ax[1][0],ax[2][1],ax[2][2]

想知道這樣理解正確嗎???

但都是不明白為什麼要(*ptr)[3] 的做法
另外, *(ptr+i)+j 為什麼+j 能使 a[0][j] <<中的j 推動呢??

是這樣嗎??

最佳答案

查看完整内容

楼主,指针和数组的问题确实很纠结呢! 你要知道如果我定义一个指针 int *p;可以用p指向一个一位数组,例如: int a[40]; p = a; 但是,p却不可以指向一个二维数组,但是二维数组可以看成是多个一位数组的组合。例如:int b[3][40],可以看成3个一位数组,而且每个一位数组有40个元素。 所以,相对的,我们定义指针,不能够直接用 int *p; 但是我们可以用 int (*p)[40],这样表示p是一个指针,指向一个包含40个int值。 但是 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-18 03:58:02 | 显示全部楼层
楼主,指针和数组的问题确实很纠结呢!
你要知道如果我定义一个指针 int *p;可以用p指向一个一位数组,例如: int a[40]; p = a;
但是,p却不可以指向一个二维数组,但是二维数组可以看成是多个一位数组的组合。例如:int b[3][40],可以看成3个一位数组,而且每个一位数组有40个元素。
所以,相对的,我们定义指针,不能够直接用 int *p; 但是我们可以用 int (*p)[40],这样表示p是一个指针,指向一个包含40个int值。
但是楼主注意 int *p[40],首先方括号和p结合,表明p是包含40个某种元素的数组。再与*结合,表明p是40个指针指向的数组。
int (*p)[40]这样就可以指向一个二维数组了。其实,指针和数组名是相通的,但是数组名是一个常量,而指针则是一个变量。
楼主一定要弄懂指针和数组,这是C语言的重难点
建议你看看这个帖子的内容:
http://bbs.fishc.com/thread-15831-1-8.html
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-18 08:59:28 | 显示全部楼层
首先,你有一个很重要的概念没搞懂,就是二维数组中,第一维是一个地址。
比如,访问第0行第0个元素,必须用ax[0][0]访问,而不能用ax[0]。
所以第一个问题中,(ptr+i)存放的是一个一维地址,*(ptr+i)取出地址值,等于ax[i]。
第二个问题(注意ax[0]本就是个地址)一样。
        *(ptr+0)==ax[0],是一个地址,所以*(ptr+0)+j(是在地址上加j,就是第j个元素地址),然後ax[0] + 0 ...+1...+2,把内存位置推过12byte,正确,但是它们都是地址,分别是&ax[0][0],&ax[0][1],&ax[0][2]。
       下面类似。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-18 13:55:30 | 显示全部楼层
我不明白的是 為什麼 (ptr+i) 他指著的明明就是 arr[0][0]
但是 ptr+i 指著竟然是 一維陣列的地址呢??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-19 08:49:57 | 显示全部楼层
我不明白的是 為什麼 (ptr+i) 他指著的明明就是 arr[0][0]
但是 ptr+i 指著竟然是 一維陣列的地址呢??

注意ptr为数组的地址,自然等于arr[0][0],但是它不是指向二维元素,而是指向一维
其实*(ptr+i)=arr[i]=&arr[i][0],这是因为ptr=数组名,ptr所占字节数为每行字节数之和
,也即是每行的首地址,而每行的首地址又等于arr[i]。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-20 19:23:12 | 显示全部楼层
*(ptr+i)就等价于ptr[i]
所以*(*(ptr+i)+j)等价于*(ptr[i]+j),等价于ptr[i][j];
int *ptr = (int*) 0;
ptr+=1;//这里ptr==4,因为ptr+1就相当于0+1*sizeof(int)
同理
int (*ptr)[3] = (int(*)[3])0;
ptr+=1;//这里ptr==0+1*sizeof( int[3] ) == 0+1*3*4 == 12
所以直接指向下一维
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-3 20:27:16 | 显示全部楼层
打什么繁体字呢,草
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-12 21:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表