首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

c语言 数组有关问题

2012-08-08 
c语言 数组问题定义一个数组char a[20]那么&a,a和&a[0]都是什么意义有区别么?求详细解释。谢谢。a是一个指针

c语言 数组问题
定义一个数组char a[20]
那么&a,a和&a[0]都是什么意义有区别么?
求详细解释。谢谢。


a是一个指针,表示这个数组的首地址,即这个指针内存放着的数组第一项的位置;
a[0]指的是第一项,是一个char型,&a[0]就是第一项的位置,故&a[0]与a是同一个意义,表示数组的首地址;
&a指的是这个指针a的地址,即a这个指针所存放的位置的地址,与前两者不一样;
这个对不对?如果对,那么一整形输出时三个的值为什么一样呢?不对求解释。

[解决办法]

C/C++ code
#include <stdio.h>int main(void){    char array[20];    char (*p)[20];    p = &array;        printf("%p\n", array);        printf("%p\n", p);    printf("%p\n", &p);        return 0;}
[解决办法]
下面的例子可以帮助理解
C/C++ code
#include <stdio.h>int main(int argc, char *argv[]){        char a[20];        printf("%p\n", a);        printf("%p\n", a + 1);        printf("%p\n", &a[0]);        printf("%p\n", &a[0] + 1);        printf("%p\n", &a);        printf("%p\n", &a + 1);        return 0;}
[解决办法]



*a

两部动作, &a,然后 *a

所以*a 指的是数组首元素



探讨
a不是指针,是个名字,,


&amp;a 是数组首元素的地址

&amp;a[0]同上






引用:
定义一个数组char a[20]
那么&amp;amp;a,a和&amp;amp;a[0]都是什么意义有区别么?
求详细解释。谢谢。


a是一个指针,表示这个数组的首地址,即这个指针内存放着的数组第一项的位置;
a[0]……

[解决办法]
首先,数组是一个拓展类型。一个数组对象是一个聚集,同时,它也是一个对象!是一个整体!c语言提供数组到其首元素指针的转换是为了方便写程序,不是说数组名就是XXX,数组名就是一个对象的名字。和其他对象的名字一样,都是一个标识符,用来代表某个对象。

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];//与上面效果一样.



对于*arr是怎么理解的?



*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);

数组名绝不不是就是指针.二维数组名更不是就是二维指针,详见我上面的链接....

[解决办法]
http://blog.csdn.net/supermegaboy/article/details/4855027
[解决办法]
a的类型是char (*)[20],


错了, char s[5][20]的 会退化为char(*)[20];

它的类型就是char s[20],最高纬度





探讨
请注意&amp;a的类型是char (*)[20],*a的类型可是char,&amp;a[0]或者&amp;*(a + 0)的类型是char *

[解决办法]
C/C++ code
a是数组名, *a 是指向数组的指针,指针指向的是这个数组的首地址。&a 和 &a[0] 也是这个数组的首地址。一个意思。所以值是一样的。
[解决办法]
&a,&a[0]遇到二维数组的时候就有区别了,自己test下 既不大庆了
[解决办法]
探讨
定义一个数组char a[20]
那么&amp;a,a和&amp;a[0]都是什么意义有区别么?
求详细解释。谢谢。


a是一个指针,表示这个数组的首地址,即这个指针内存放着的数组第一项的位置;


a[0]指的是第一项,是一个char型,&amp;a[0]就是第一项的位置,故&amp;a[0]与a是同一个意义,表示数组的首地址;
&amp;a指的是这个指针a的地址,即a这个指针所存放……


[解决办法]
&a 是数组的首地址,即首元素的地址;
a 是数组名;
&a[0] 是元素a[0]的地址,与&a表示相同值;
[解决办法]

&a 是指针数组 


探讨

&amp;a 是数组的首地址,即首元素的地址;
a 是数组名;
&amp;a[0] 是元素a[0]的地址,与&amp;a表示相同值;

热点排行