指针数组和数组指针
以下程序的输出是( )[美国某软件公司2009年12月面试题目]
解析:本题定义一个指针指向一个10个int元素的数组。a+1表明a指针向后移动
1*sizeof(数组大小);a+1后共向后移动40个字节。*a+1仅针对这一行向后移动4个字节,如下
图所示。
答案:输出如下:
1 11 2 2 11
一个指向整型数组的指针的定义为( )。
A.int (*ptr)[]
B.int *ptr[]
C.int *(ptr[])
D.int ptr[]
解析:
int (*ptr)[]是一个指向整型数组的指针。
int *ptr[]是指针数组,ptr[]里面存的是地址。它指向位置的值就是*ptr[0]、
*ptr[1]、*ptr[2]、*ptr[3]。不要存*ptr[0]=5;、*ptr[1]=6;,因为这里面没有相应
的地址。
int *(ptr[])与B相同。
int ptr[]是一个普通的数组。
答案:A
--------------------------------------------------------------------------------------------------------------------------------------------------------------
a是指针数组,是指一个数组里面装着指针。
b是指向数组的指针,代表它是指针,指向整个数组。
以下是指针数组a:
下面是数组指针b:
------------------------------------------------------------------------------------------------------------------------------------------------------
写出如下程序片段的输出。[美国某著名CPU生产公司面试题]
解析:第一个结果好理解,是正常的指针运算。但是第二个却有点难以理解。
第二个的确是5。首先a表示一个1行5列数组,在内存中表示为一个5个元素的序列。int
*ptr=(int*)(&a+1)的意思是,指向a数组的第6个元素(尽管这个元素不存在)。那么显然,
(ptr-1)所指向的数据就是a数组的第5个元素——5。
如果存在这样的数组:
那么显然:
实际上,b的数据分布还是按照1、2、3、4、5、6、7、8、9、10分布的,所谓b[0]和
b[1]实际上只是指向其中一个元素的指针。
时刻牢记这样的观点:数组名本身就是指针,再加个&,就变成了双指针,这里的双指
针就是指二维数组,加1,就是数组整体加一行,ptr指向a的第6个元素。
答案:2,5。