c语言,数组和指针
概要:
1.普通数组与指针
2.数组指针
3.指针的数组
数组是一个由(同一类型)连续元素组成的预先分配的内存块;指针是一个对任何位置的元素的引用。
数组自动分配空间,但不能重分配或改变大小;指针必须被赋值以指向分配的空间,可以随意重新赋值。
指针可以模拟数组;几乎没有所谓数组的东西,实际是个指针操作符。
1.普通数组和指针
#include <stdio.h> int main() { int arry[10]; int *p=arry; arry[1]=100; printf("arry[1]=%d,p[1]=%d \n",arry[1],p[1]); return 0; } /* root@oucaijun:/work/dcc# gcc *.c; ./a.out arry[1]=100,p[1]=100 */
2.数组指针
为什么数组的指针在声明时一定说明数组最后一个维度的大小呢?答案很简单。
数组指针虽然是一种指向指针的指针,但是,既然我们称其为数组指针而不是普通的指向指针的指针,就是因为他们之间有一个根本性的区别。
普通指向指针的指针,在类型信息描述中,包含的是其指向的指针变量占用的空间(也就是说,恒为2);
而数组指针在类型信息里面包含了数组的大小信息(在多维数组指针中,可以忽略前面各个维度的大小,但是不能忽略最后一个维度的大小,在随后的章节中,我们将详细讲解其中的原因)。
通俗的说:作为一个数组指针,要想与普通的“指向指针的指针”划清界限、标新立异,就必须要包含数组的大小信息,否则就“没有脸面被称之为数组指针”。
因此,对于一个指向数组的指针来说,要想证明自己是一个真正的“数组指针”而不是普通的“指向指针的指针”,就必须拥有数组大小“这一关文凭'。而且,这一“文凭”在数组指针参与sizeof()运算时还要出具。如果sizeof()发现其出具的文凭等级不够,编译器会报告错误。
#include <stdio.h> int main() { int i, j; int arry[2][3]={ {11,12,13}, {21,22,23}}; int (*q)[][3]=&arry; //q是一个指针,该指针指向一个x*3二维数组,数组内的数据元素是int。 int (*p)[2][3]=&arry; //p是一个指针,该指针指向一个2*3二维数组,数组内的数据元素是int。 //printf("sizeof(*q)=%d\n",sizeof(*q)); // error: invalid application of ‘sizeof’ to incomplete type ‘int[][3]’ printf("sizeof(*p)=%d\n",sizeof(*p)); printf("sizeof(arry)=%d\n",sizeof(arry)); for(i = 0; i < 2; i++ ){ for(j = 0; j < 3; j++ ){ printf("arry[%d][%d] = %d\n", i, j, arry[i][j]); } } for(i = 0; i < 2; i++ ){ for(j = 0; j < 3; j++ ){ printf("(*q)[%d][%d] = %d\n", i, j, (*q)[i][j]); } } for(i = 0; i < 2; i++ ){ for(j = 0; j < 3; j++ ){ printf("(*p)[%d][%d] = %d\n", i, j, (*p)[i][j]); } } return 0; } /* root@oucaijun:/work/dcc# gcc *.c; ./a.out sizeof(*p)=24 sizeof(arry)=24 arry[0][0] = 11 arry[0][1] = 12 arry[0][2] = 13 arry[1][0] = 21 arry[1][1] = 22 arry[1][2] = 23 (*q)[0][0] = 11 (*q)[0][1] = 12 (*q)[0][2] = 13 (*q)[1][0] = 21 (*q)[1][1] = 22 (*q)[1][2] = 23 (*p)[0][0] = 11 (*p)[0][1] = 12 (*p)[0][2] = 13 (*p)[1][0] = 21 (*p)[1][1] = 22 (*p)[1][2] = 23 */
3.指针的数组
这个没甚么特别的。