您好,匿名用户
随意问技术百科期待您的加入

C语言二维数组名问题

+1 投票
#include <stdio.h>
int main(int argc, const char *argv[])
{
	int a[2][3] = {
		{1, 2, 3}, 
		{4, 5, 6}
	}; 
	
	printf("%p\n", a);
	printf("%p\n", *a);
	return 0;
}

打印的结果是,一样的指针.

a究竟是怎么存储的,怎么会出现a和*a是一样的呢?

用户头像 提问 2012年 12月1日 @ Garen 上等兵 (269 威望)
分享到:

1个回答

+1 投票
 
最佳答案

cut the crap,看图:

http://instagram.com/p/RJpP5puqv0

之前看的一篇文章:Learning C using GDB,你可以看看 https://www.hackerschool.com/blog/5-l...

#include<stdio.h>

int main(){
    int a[] = {1,2,3};
    printf("a[0]=%d\n", a[0]);
    printf("*(a+0)=%d\n", *(a+0));
    printf("a[1]=%d\n", a[1]);
    printf("*(a+1)=%d\n", *(a+1));
    return 0;                                                             
}

array的index access在C里只是对指针操作的一个语法糖。a[n]完全等价于*(a+n)

回到你的问题。

  1. C语言里int a[10]的话,a是一个指针指向a[0]的指针
  2. C语言里int a[2][3]的话,a[0]是一个指向a[0][0]的指针,a[1]是一个指向a[1][0]的指针

在你的代码里,int a[2][3]

  1. *a指向a[0][0]这个int
  2. a指向a[0] = {1, 2, 3}这个array。只不过在C里面,array的地址就是array第一个元素的地址,所以在这里a = a[0] = a[0][0]
  3. a*int[3]的指针,对其进行+1操作,内存指针往后移动sizeof(int[3])个位置
  4. *aint指针,对其进行+1操作,内存指针往后移动sizeof(int)个位置

你可以运行下面代码测试下

#include<stdio.h>

int main(){
    int a[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    printf("%p\n", a);
    printf("%p\n", a+1);
    printf("%p\n", (*a+1));
    return 0;                                                             
}
用户头像 回复 2012年 12月1日 @ Kennen 上等兵 (442 威望)
选中 2012年 12月1日 @Garen
提一个问题:

相关问题

0 投票
1 回复 46 阅读
用户头像 提问 2012年 12月1日 @ Kyrie 上等兵 (240 威望)
0 投票
1 回复 28 阅读
用户头像 提问 2012年 12月1日 @ Dionysus 上等兵 (229 威望)
0 投票
1 回复 23 阅读
用户头像 提问 2014年 2月15日 @ Thresh 上等兵 (138 威望)
0 投票
1 回复 32 阅读
用户头像 提问 2013年 12月15日 @ Fiddlesticks 上等兵 (242 威望)
0 投票
1 回复 37 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...