C语言二维数组指针 函数引用

int (*p2)[3]表示p2首先是一个指针,然后它是一个指向长度为3的一维整型数组的指针.*(*p2)[3]不是合法的定义式.在使用时p2和*p2的值虽然相等,但是类型前者是int (*)[],后者是int [].不懂再问.

c语言中,数组名其实是数组第一个元素的地址,是个指针.所以*a和a[0][0]是同一个东西 二维数组其实是数组的数组,这么说了你应该能明白了.所以*(a+1)就是a的第二格数组元素,也就是a[1],这还是一个数组名,指向这个数组的第一个元素,所以*(a+1)就是a[1][0]*号运算符是间接寻址运算符,,当它应用于指针时,它将访问指针所指向的对象.(摘自《c程序设计语言》) 别的自己仔细想想,总会想明白

二维数组名a是一个指向指针的指针.也是一个指针数组名,它含3个元素,a[0]a[1],a[2].虽然a存储的地址是该数组首元素的地址,但它指向的并不是一个变量,而是一个指针.应为a是一个指向指针的指针,它指向的是和自己存储的地址相同的指针,即a[0],a[0]是第一行一维数组的指针,可以指向具体变量.这下明白了吧,*(a+0)它不是变量,她是指针,a指向a[0],*(a+0)就是a[0].

我是这样理解的:a是一个二维数组,也就是一个二级指针,那么a代表指向数组头的二级指针,*a代表指向数组头的一级指针,**a代表第一个数组元素.因为二维数组只是一维数组在内存地址上的连续表示,所以a和*a的区别在于它们的有效范围不同,分别是数组的两个维度的维数.所以a和*a都是指向数组头的指针,它们都指向第一个元素,所以输出的地址相同.证实:#include <stdio.h>int main(){ int a[2][2] = {1,2,3,4}; printf("%x, %x, %d\n", a, *a, **a); return 0;}输出结果:

要int **p=a;才行.因为int *p定义的p是指向int型变量的,而二维数组a表示指向数组的指针,也就是指向指针的指针,所以类型不同,不能直接赋值.

“*(a+0)”就是指向“(a+0)”这个地址的内容,这是对的 但是他的内容也是一个地址,该地址指向一个一维数组,他的值与a[0]是相同的至于数组中的元素 因为a是个指针的指针 想要引用元素 就必须两个解引用符号** 比如 **(a+0) 就是a[0][0]的值 类似的 *(*(a+1)+3)==a[1][3] 配合楼上的 你应该懂了吧

二维数组和指针 ⑴ 用指针表示二维数组元素.要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题.一个二维数组在计算机中存储时,是按行存储的,即先存储第一行的元素,再存储第二行的元素.当把每一行看作一个整

二维数组的本质还是一位数组返回数组指针就可以int a[3][10];//假设全局int * func(){ return a; //返回的就是数组的指针}int main(void){ int *b; b=func(); //这里b就指向数组地址 return 0;}

系统很难判断你是否非法引用了.只能自己判断.比如int n[2][2];里只能有n[0][0]到n[1][1]四个元素,而如果你scanf("%d",&n[2][2]);就算是非法引用了.不报错,但运行不了.二维数组名本身是个指向指针的指针,而行首名是int型指针.

先从存储的角度对二维数组作一个全面的了解.二维数组在内存中的存储,是按照先行后列依次存放的.从内存的角度看,可以这样说,二维数组其实就是一个一维数组,在内存中没有二维的概念.如果把二维数组的每一行看成一个整体,即看

相关文档

二维数组指针函数调用
指针做函数参数传递的过程
二维数组指针函数传递
二维数组做函数形参
c语言二维数组指针
二维数组指针
指针指向二维数组
c语言函数传递二维数组
gyzld.cn
artgba.com
pznk.net
xaairways.com
sgdd.net
电脑版