数组和指针

nanjingnew4 2011-12-28 04:16:40
最近看帖子总结下了数组,发现
一维数组:
int a[5]={1,2,3,4,5},*p;
p=a;//将a的首地址赋值给p
printf("%d\n",*a);
printf("%d\n",*p);
答案相同

二维数组:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p;
p=a;//将a的首地址赋值给p
printf("%d\n",*p);
printf("%d\n",**a);
答案相同

问题1:上面的注释是否有误(是不是将a的首地址的值赋值给p)
问题2:如果问题1成立,那么回头再看两段注释,应该怎么加?? 一维数组:如果是将a的首地址的值赋给p,那么*p
就有错。



...全文
155 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Patelinsc 2011-12-29
  • 打赏
  • 举报
回复
对于编译器,数组的操作跟指针一样(前提示在表达式中),数组名就是指针,可以跟指针的操作一样。
一维数组就是指向变量(如a[1]、a[2]....)的指针,那么a是它的首地址赋值,没错。*p得到他的第一个元素的值。
二维数组是指向指针的指针。a相当于a+0;指向第一个数组的首位。于此类推a+1指向第二个数组的首位......那么*a就得到第一个数组首位的地址。那么再解引**a就是第一个数组首位的值。同时,二维数组在内存的存储是连续的一片内存,那么int *p = &a;就是指向这片内存的第一个位置,解引用就是第一个位置的值,就是a[0][0].
我是这样理解的。菜鸟来的!!!!
iamnobody 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 nanjingnew4 的回复:]
你对于*arr是怎么理解的?
[/Quote]

*arr;//很明显,数组本身是不存在*(解引用)操作的.于是数组转换成首元素的指针,再被解引用.

*(arr + 0)//这样写也是一样的.不过这里是因为加法操作而转换成指针.


实际上,除了在sizeof(),和&操作之外,其他情况都会转换成指针.

你试试:
int arr[3];
sizeof(arr);
int * p = &arr;//错;
int (*P)[3] = &arr;//对/


对于二维数组:

int arr[3][2];
*arr;//这里跟上面一样,转换成首元素指针,于是*arr表示int [2]数组.

试试:sizeof(*arr) == 8;
int (*)[2] = &*arr ;

**arr;//之所以可以这么写是因为上面转换成来的 int [2];数组还可以再次转换成首元素指针.再次被解引用,实际上这样更直观 *(*arr);

数组名绝不不是就是指针.二维数组名更不是就是二维指针,详见我上面的链接....
nanjingnew4 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mingliang1212 的回复:]
数组名不是首地址!!
数组名就是代表一个数组.数组名可以隐式转换成首元素的指针(指针不是地址!!!)

数组与指针
其实在C数组都是一维的..


int arr[3];
arr 是数组名,可以隐式转换成首元素的指针,这时元素类型是int,所以可以转换成int*
int* p = arr;//正确.
int*p = &arr[0];//与上面效果一样.

int a……
[/Quote]

你对于*arr是怎么理解的?
nanjingnew4 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 gaoyue_qq_1664507529 的回复:]
二维数组:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p;
p=a;//将a的首地址赋值给p
printf("%d\n",*p);
printf("%d\n",**a);
答案相同

p=a//这条根本编译不通过。有语法错误(VS2005)
[/Quote]

我是在linux下用gcc编译的。。有warning.但可以通过。。换成p=*a可以通过
  • 打赏
  • 举报
回复
二维数组:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p;
p=a;//将a的首地址赋值给p
printf("%d\n",*p);
printf("%d\n",**a);
答案相同

p=a//这条根本编译不通过。有语法错误(VS2005)
如此美丽的你 2011-12-28
  • 打赏
  • 举报
回复
const int * a;
AnYidan 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 c_losed 的回复:]

二维数组的代码有问题吧
C/C++ code
p=&a[0][0];//将a的首地址赋值给p
[/Quote]

++
鲤鱼 2011-12-28
  • 打赏
  • 举报
回复
一维数组:*(p+i)
二维数组:*(*(p+i)+j)
iamnobody 2011-12-28
  • 打赏
  • 举报
回复
数组名不是首地址!!
数组名就是代表一个数组.数组名可以隐式转换成首元素的指针(指针不是地址!!!)

数组与指针
其实在C数组都是一维的..


int arr[3];
arr 是数组名,可以隐式转换成首元素的指针,这时元素类型是int,所以可以转换成int*
int* p = arr;//正确.
int*p = &arr[0];//与上面效果一样.

int arr2[3][2];
arr2 是数组名,可以隐式转换成首元素的指针,这时元素类型是int [2];//是一个一维数组.所以可以转换成int(*)[2];//指向数组的指针.

int (*p)[2]=arr2;//正确.
int (*p)[2] = &arr2[0];//与上面效果一样.
nanjingnew4 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 c3764 的回复:]
问题1:注释正确,但是不够明确
一维数组的注释可以解释为:将a的首地址&a[0]赋值给p
二维数组的注释可以解释为:将a的首地址即a[0][]的首地址&a[0][0]赋值给p

问题2:一维数组:如果是将a的首地址的值赋给p,那么*p就有错?
a的首地址&a[0]赋值给p, p==&a[0] *p==a[0]
[/Quote]

a就是表示数组a的首地址,对应的应该是a[0][]的首地址
所以我这样赋值p=*a经过编译可以通过。
printf也是可以的。。
printf("%d\n",*p);//就是打印a[0][]地址存放的数值
a就是代表数组的首地址,和*a一样但是p=a这个写法能通过。
但是数组的首地址不是a[0][0],是a[0][],只不过地址恰好和a[0][0]一样而已
因为printf("%d\n",*a);
打印出的是a的首地址,而不是a[0][0]的值
nanjingnew4 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 c_losed 的回复:]
二维数组的代码有问题吧

C/C++ code

p=&a[0][0];//将a的首地址赋值给p
[/Quote]
编译能过。。。p=*a,这个编译也能过。*a就是取二维数组的首地址吧
l360220954 2011-12-28
  • 打赏
  • 举报
回复
数组和指针是c和c++语言里面非常不好掌握的部分,这部分如果能够融会贯通的话,那么c就学得非常好了,我在上个项目编程的时候就因为指针问题而造成了很大的内存泄漏...
nanjingnew4 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]
要看清楚数组在栈上的分配模式
在行优先的情况下int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}其实是
1 2 3 4 5 6 7 8 9 10 11 12
a的地址就是a[0][0]
[/Quote]

a的地址不是a[0][0]吧,是a[0]吧,用printf可以验证的
吊吊鱼 2011-12-28
  • 打赏
  • 举报
回复
问题1:注释正确,但是不够明确
一维数组的注释可以解释为:将a的首地址&a[0]赋值给p
二维数组的注释可以解释为:将a的首地址即a[0][]的首地址&a[0][0]赋值给p

问题2:一维数组:如果是将a的首地址的值赋给p,那么*p就有错?
a的首地址&a[0]赋值给p, p==&a[0] *p==a[0]
c_losed 2011-12-28
  • 打赏
  • 举报
回复
二维数组的代码有问题吧
p=&a[0][0];//将a的首地址赋值给p  
ouyh12345 2011-12-28
  • 打赏
  • 举报
回复
要看清楚数组在栈上的分配模式
在行优先的情况下int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}其实是
1 2 3 4 5 6 7 8 9 10 11 12
a的地址就是a[0][0]

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧