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

数组名和数组的第一个元素解决办法

2012-02-13 
数组名和数组的第一个元素int a[100]{1,3}std::coutastd::endlstd::cout(&a[0])std::endla是

数组名和数组的第一个元素
int a[100]={1,3};


std::cout<<a<<std::endl;


std::cout<<(&a[0])<<std::endl;


a是数组名,std::cout的时候,会打印出数组的首地址

&a[0]是数组的第一个元素的首地址, 


vs2008,结果是一样的。。。。。

说明:数组的首地址和数组的第一个元素的地址是一样的.




定义一个数组指针 int(* p)[100]=&a;


std::cout<<(*p)<<std::endl;

p指针指着数组a, *p 是数组的首地址。。。


我如何通过 p来操作 该数组呢???


我发现*(p+1)也搞不定/??/



[解决办法]
通过指针操作数组,应该为int *p=a,这样就可以*(p+1),你那个是针对二维数组的
例如:int a[3][100],(*p)[100];p=a(指向&a[0][0]);p++;(指向&a[1][0])。
3L的说法是正确的,这里的s是指针数组,指向三个字符串:"123" "456" "7890",一个指针的大小是4(x86) 8(x64),所以大小为12(x86) 24(x64)
注:x86指三十二位系统,x64指64位系统,如还有疑问,可+QQ799071506(已回家)
[解决办法]
数组与指针
http://topic.csdn.net/u/20091123/11/0c03d2e2-0655-4634-8287-0e2315d889fc.html?91173

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



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

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

热点排行