1.a不是指针,a是数组,c 语言里的数组,它是一个二维数组,它和c 语言的基本数据类型不一样,属于构造类型 如果是指针,sizeof(a)的值就是4了,可惜不是. sizeof(a)的值是这个类型大小,可以写代码打印出来这个值看看,一目了然 数组名可以给指针复制,是因为c 语言为了提高访数组问效率,做了这种处理,尤其在把数组名当做实参传入函数的时候,这种方式十分有用,同时也导致初学者容易将指针和数组混淆起来 2. int输入法表示的数据类型是整形。 int a 表示a这个变量是整型,只能存放整数。 int a【10】【10】 指的是代表a的二维数组,是指向一个有十个元素的数组的指针,或者说a是具有十个元素的数组的首元素的地址,这十个元素,每个元素都是一个数组。 简略的说,A就是整型二维组 3. 1.在C语言的定义中,二维数组可以看作一个一维数组,每个元素还是一个一维数组。 int a[m][n]; 表示一个包含m个元素的一维数组,每个元素是一个包含n个整型数据的一维数组。(参考K&R C 第二版 5.7 Multi-dimensional Arrays) 2.在C语言中,指针和数组有相似之处,但是两者本质不同。两者相似的地方有两点:
就二维数组来说,“相似”的指针应该指向和二维数组的子数组相同的数据类型,如 int (*p)[n] = a; 此时可以用a[i][j]或p[i][j]或*(p+i)[j]或*(a+i)[j]来获取相同的数据。 在声明一个接受一个二维数组的函数原型时,会忽略第一层数组的长度,等效的是上述指针类型的参数。即下面两种函数原型的声明都可以成功接受a做参数: void f1(int a[][n]); void f2(int (*a)[n]); (参考K&R C 5.3 5.4 5.7) 3.而数组的本质并不是指针类型,虽然C语言在实现上很多时候两者表现可以相同,但是数组的标志符(如a)是不能作为指针用的。你不能将a“指向”另一个数组,或者说不能向数组赋值,或者说数组除了初始化的时候,不能作为左值: int b[m][n]; a = b; /* 这是错的*/ a = {... ...}; /* 也是错的 */ 同样上述的指针p也不能作数组用,因为指针的初始化只会申请指针本身的空间: int (*p)[m] = {... ...}; /* 也是错的 */ 最后,可以学习《你必须知道的495个C语言问题》第6章 “数组和指针”里边的问题,或许有你遇到的问题。 4. 嗨,是指向二維數組(Array)的指針(Pointer)沒錯 假設要取第i個row,第j個column的值, 0<=i,j<10,代表index 可以這樣取值 int b=*(*(a+i)+j); 當然也可以用一般Array表示法取值int b=a[i][j]; 一般是用來存取矩陣(Matrix),做矩陣運算時最常使用二維,但如果是稀疏矩陣(Sparse Matrix),即有使用的index很少,則以Linked List實現較佳 5.int a,则a是int类型 int【】 a,则a是int【】类型 int【】【】a,则a是int【】【】类型 6. 就是一个地址,是一个常量不可修改,是一个包含10个元素的数组的首地址,注意是元素不是int,每个元素都是一个包含10个int的数组,用指针来理解的话就是一个指针数组的首地址 |
|
来自: thchen0103 > 《c语言学习资料》