一级指针还有二级指针还有指向行数组的指针之间的区别,,具体举个例子解释下吧
3个回答
展开全部
我这里用int类型的指针为例:
int *p; p=new int; 或是p=new int[5];通过一个指针可以创建一个实体或多个实体,并通过*p或者p[i]的形式来访问实体空间,也就是通过一个指针可以创建一行或是一列实体,也就是可以创建一个数组。
现在试想:我想创建一个5*4的矩阵,我用指针创建数组怎么做?
首先,每一行的创建需要一个int类型的指针,我现在要创建五行,所以我需要5个int 类型的指针。而5 个int类型的指针又可以组建一个数组实体个数是5,只不过这时实体变成了int*, 而先前创建的实体是int 数据。
这个指针数组的创建就需要到二级指针也就是指向指针的指针:int **q; q=new int*[5];
q[0]=new int[4];完成了一行的创建,之后的各行类似,我不知道你说的指向行数组的指针是不是和这里的q[0]类似?如果是的话那么我觉得二级指针可以用来构建一个行数组指针。
我写的不清楚的话,再来联系我讨论好了。
学习需要坚持加油啊!
int *p; p=new int; 或是p=new int[5];通过一个指针可以创建一个实体或多个实体,并通过*p或者p[i]的形式来访问实体空间,也就是通过一个指针可以创建一行或是一列实体,也就是可以创建一个数组。
现在试想:我想创建一个5*4的矩阵,我用指针创建数组怎么做?
首先,每一行的创建需要一个int类型的指针,我现在要创建五行,所以我需要5个int 类型的指针。而5 个int类型的指针又可以组建一个数组实体个数是5,只不过这时实体变成了int*, 而先前创建的实体是int 数据。
这个指针数组的创建就需要到二级指针也就是指向指针的指针:int **q; q=new int*[5];
q[0]=new int[4];完成了一行的创建,之后的各行类似,我不知道你说的指向行数组的指针是不是和这里的q[0]类似?如果是的话那么我觉得二级指针可以用来构建一个行数组指针。
我写的不清楚的话,再来联系我讨论好了。
学习需要坚持加油啊!
展开全部
C菜鸟助手成员tonytvb为你解答(如有疑问请hi我或向我的团队提问):
你大概是对指针不是很了解吧!
这样得先让你对指针了解才行。
1、指针指向的是地址
我们知道内存存放数据是通过地址来访问的
而指针就行相当于负责指向这个地址的作用
如int a=10,系统会分配一个地址例如为1000
那么我再定义一个int *p=&a;意思就是指向这个1000的地址
但是如果我在这个基础上又想访问1000这个地址呢?
其实1000你换个角度来想,这个地址其实也可以看作是一个数据
那么1000这个地址可不可以又有一个地址指向它呢?
答案是可以的,这就出现了所谓的二级指针了
int **q=&p;意思就是指向这个1000的地址,假如地址为2000
按这样下去是相当于可以生成无限的级别的指针的!
所以理解了就可以了。
而你所说的指向数组的指针就是相当于二级指针
意思一样的,不懂再问!
如有更多的疑问请hi我
在这里给自己新创建的团队“C菜鸟助手”打个小广告,
各位如果有C/C++方面不懂的可以一起讨论!
不为分数,只为解决问题!
谢谢,祝各位生活愉快!
你大概是对指针不是很了解吧!
这样得先让你对指针了解才行。
1、指针指向的是地址
我们知道内存存放数据是通过地址来访问的
而指针就行相当于负责指向这个地址的作用
如int a=10,系统会分配一个地址例如为1000
那么我再定义一个int *p=&a;意思就是指向这个1000的地址
但是如果我在这个基础上又想访问1000这个地址呢?
其实1000你换个角度来想,这个地址其实也可以看作是一个数据
那么1000这个地址可不可以又有一个地址指向它呢?
答案是可以的,这就出现了所谓的二级指针了
int **q=&p;意思就是指向这个1000的地址,假如地址为2000
按这样下去是相当于可以生成无限的级别的指针的!
所以理解了就可以了。
而你所说的指向数组的指针就是相当于二级指针
意思一样的,不懂再问!
如有更多的疑问请hi我
在这里给自己新创建的团队“C菜鸟助手”打个小广告,
各位如果有C/C++方面不懂的可以一起讨论!
不为分数,只为解决问题!
谢谢,祝各位生活愉快!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
回楼主的补充问题:
(*p)[4]只能指向一个有4个元素的数组的开头,而如果指向5个元素的数组或者指向其它类型就不行,后面加个[4]是为了方便用i*m j公式计算地址用的.
(*p)[4]指向第一维有四个元素的二维数组,方便今后用p[i][j]的方式调用,但是如果指向了其他东西,C语言也是允许的,只不过用到p[i][j]是仍旧当他那样是第一维有四个元素的二维数组处理。
看了上述解释以后一头雾水也没关系,实际上C语言的指针是相当灵活的,它不检查指针的操作,所以他功能强大,也很危险。例如:
char a[8]={0,1,2,3,4,5,6,7};
int (*p)[4]=a;
printf("%d",p[0][2]); /* 1284 (等于5*256 4,即二进制00000101 00000100) */
printf("%d",p[1][3]); /*超过a范围,结果随机*/
printf("%d",p[-1][4]);/*256 相当于p[0][0]*/
上面这段东西我在tc里面试验,第二行有警告,编译仍然通过。
(*p)[4]只能指向一个有4个元素的数组的开头,而如果指向5个元素的数组或者指向其它类型就不行,后面加个[4]是为了方便用i*m j公式计算地址用的.
(*p)[4]指向第一维有四个元素的二维数组,方便今后用p[i][j]的方式调用,但是如果指向了其他东西,C语言也是允许的,只不过用到p[i][j]是仍旧当他那样是第一维有四个元素的二维数组处理。
看了上述解释以后一头雾水也没关系,实际上C语言的指针是相当灵活的,它不检查指针的操作,所以他功能强大,也很危险。例如:
char a[8]={0,1,2,3,4,5,6,7};
int (*p)[4]=a;
printf("%d",p[0][2]); /* 1284 (等于5*256 4,即二进制00000101 00000100) */
printf("%d",p[1][3]); /*超过a范围,结果随机*/
printf("%d",p[-1][4]);/*256 相当于p[0][0]*/
上面这段东西我在tc里面试验,第二行有警告,编译仍然通过。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询