在C语言编程中指针经常困扰着我们,但是若能灵活运用指针的话,将会使得我们编程变得更加轻松与高效。这里讲下*p[N], (*P)[N],及**p的区别,这也是之前经常困扰我的地方。

这三者的定义分别为:

int  *p[N]表示指针数组,也就是说定义了N个不同指向int型的指针。

int (*p)[N]表示定义一个指针,指向一个int[N]型的指针。

int **p 表示定义一个指向指针的指针。

注意[]的优先级要高于*。

指针即表示一个存放某种数据类型变量的地址,例如:

#include <stdio.h>
#include <math.h> int main()
{
int *p, i;
int a[];
p = a;
for(i=; i<; i++)
a[i] = i;
printf("%d\t%d\n", *(p+), a[]);
   return 1;
}

这里p存储的是数组a的首地址,且为int类型,那么p+1表示p向后移动一个int型的字节得到的地址,也就是a[1]的地址。

上述结果即为:

   

下面通过一些例子来说明这些指针*p[N], *p[N]和**p的区别。

#include <stdio.h>

int main(int argc, char* argv[])
{
int i, j;
int (*p1)[], *p2[], **p3;
int b[][]; for(i=; i<; i++ )
for(j=; j< ; j++)
b[i][j] = *i + j;
p1 = b;
for(i=; i< ; i++)
p2[i] = b[i]; p3 = malloc( * sizeof(*p3));
for(i=; i< ; i++)
*(p3+i) =b[i];
printf("the matrix is :\n");
for(i=; i< ; i++)
{ for(j=; j< ; j++)
printf("%d\t", b[i][j]);
printf("\n");
}
printf("%d\t%d\t%d\n", *(*(p1+)+), *(p2[]+), *(*(p3+)+));
}

解释说明:

  *p[3]表示一个指针数组,可以理解为定义了三个指针*p1[0], *p1[1], *p[2],在该例子中分别将b[0]的地址赋值给p[0],b[1]的地址赋值给p[2],...,因此*(p2[1]+1)表示的是*(b[1]+1)的值,也就是b[1][1].

**p表示一个指向指针的指针,也可以理解为p存储的是一个地址的地址。比如在该例子中,{b[0], b[1], b[2]}可以认为是一个数组,里面的元素为一个地址,p存储的是该数组的初始地址,也就是说*p指向的是该数组的第一个元素(*(p+1)表示这个数组的第二个元素),但注意到这第一个元素还是一个地址,其相当数组b[0]的首地址,因此*(*(p3+1)+1)相当于*(b[1]+1),也就是b[1][1]

(*p)[3]改变了自然的运算符的优先级,相当于(int)((*p)[3])。一有指针就头疼,我们把指针先替换掉,就是int a[n],是一个n维数组,数组首地址(也就是数组名)是a。那么,int (*p)[n]也是一个n维数组,但是这个数组的首地址是*p,也就是说,p指向的内容,是一个数组的首地址。那么,p就是指向一个数组的指针,这个数组中的元素都是int。实际上,p3相当于一个二重指针,这个和**p其实差不多。

以上是我关于指针的一些个人理解,若有错误之处,希望广大网友指出,

 

参考博文:http://blog.csdn.net/ywb201314/article/details/52062059

C语言中指针*p[N], (*P)[N],及**p的区别的更多相关文章

  1. C语言中指针占据内存空间问题

    以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...

  2. 这样子来理解C语言中指针的指针

    友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...

  3. C语言中指针和数组

    C语言数组与指针的那些事儿 在C语言中,要说到哪一部分最难搞,首当其冲就是指针,指针永远是个让人又爱又恨的东西,用好了可以事半功倍,用不好,就会有改不完的bug和通不完的宵.但是程序员一般都有一种迷之 ...

  4. Go语言中的有缓冲channel和无缓冲channel区别

    Go语言中的有缓冲channel和无缓冲channel区别 结论 ch1:=make(chan int)// 无缓冲 ch2:=make(chan int,1)// 有缓冲 无缓冲: 当向ch1中存值 ...

  5. 理解C语言中指针的声明以及复杂声明的语法

    昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...

  6. 编程基础-c语言中指针、sizeof用法总结

    1.指针 学习 C 语言的指针既简单又有趣.通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的. ...

  7. C语言中指针和多维数组

    指针和多维数组 数组名是特殊的指针 数组是一个特殊的指针,多维数组也是更为复杂的数组,它们的关系是什么样的呢? 我们通过一个简单的例子来比较形象的了解指针和多维数组: int a[2][3]; 这是一 ...

  8. C语言中整形数组、字符数组、字符串的区别

    一. 第一 整型数组的存放,数组最后是不加'\0'的,字符串会自动加上,因此存放字符的时候数组的大小要比实际字符的多一个 第二 整型数组 每一个单元是4个字节的,字符串是一个一个字符存放的,每个字符占 ...

  9. 对C语言中指针的一些新认识

    学C语言这么久了,才发现指针不是想象中那么简单,当初根本就没理解指针怎么用! 变量--是由操作系统自动分配存储空间的    指针--手动分配存储空间或指向已有变量的地址 指针中的内容需要手动释放,而变 ...

随机推荐

  1. An internal error occurred during: "Launching web on MyEclipse Tomcat"

    An internal error occurred during: "Launching web on MyEclipse Tomcat" 解决办法1 1.首先关闭MyEclip ...

  2. Linux(1)目录

    Linux目录 / :根目录, 一般只存放目录, 在Linux下只有一个根目录. 所有的东西都是从这里开始 /bin, /usr/bin :可执行的二进制文件目录, 如常用的ls, tar, mv, ...

  3. C++ STL map详解

    一.解释: p { margin-bottom: 0.25cm; direction: ltr; color: #00000a; line-height: 120%; text-align: just ...

  4. 正则表达式大全 --【Python举例】

    包含 :  纯文字.正负数,小数.正数.正整数.月份.天数.用户名.密码.车牌.传真.手机.邮件.ipv4私有地址.ipv4地址.ipv6地址.json_header.request_header 有 ...

  5. 用java调用.net的wcf其实还是很简单的

      前些天和我们的一个邮件服务商对接,双方需要进行一些通讯,对方是java团队,而作为.net团队的我们,只能公布出去的是一个wcf的basicbinding,想不 到问题来了,对方不知道怎么去调用这 ...

  6. 让你的Dapper像EF一样调用 开源~!

    什么是Dapper? Dapper是一款轻量级的ORM框架,大名鼎鼎! 由谷歌Google 开发,在N款orm框架中 效率是最快的 最高的! 经过数据测试 比EF快 12-20 倍 国外最大的技术网站 ...

  7. java学习笔记随记

    12月21日 其中1  2 是赋值 Source----format 格式化调整代码 shift+ctrl+F Ctrl +d 删除行 代码规范, 首字母大写 System.out.println其中 ...

  8. 怎么用snapman一个人在三天内开发出一个复杂的软件开发项目管理系统

    snapman是一个简单而强大的团队协作软件,在上面的信息可以是数据.可以是规则.也可以是自动化代码:最重要的它是一个可以开发的协作平台,所有信息都可以作用到所有人或机器上,大大减少了工作的复杂度.软 ...

  9. spotlight 索引重建

    从Mac的App Store 上 自动更新微信之后,发现不能在SpotLight上搜索到了. 想着应该是索引出现了问题. 方法一. 采用如下命令重建索引: sudo mdutil -i off /该命 ...

  10. CSS中浮动和定位对元素宽度/外边距/其他元素所占空间的影响

    ---恢复内容开始--- 一.width:auto和width:100%的区别   1.width:100%的作用是占满它的参考元素的宽度.(一般情况下参考元素 == 父级元素,这里写成参考元素而不是 ...