在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. 华为服务器Linux在线做RAID方法

    背景概述 最近维护大数据的一些主机,大概有3k+的数目,有很大一部分是华为的服务器,大部分是12块数据盘,单盘做RAID0来存放数据,但是通常硬件是不可靠的,磁盘损坏是常态, 然而磁盘损坏进行定位更换 ...

  2. 关于Spring事务<tx:annotation-driven/>的理解(Controller可以使用@Transactional)

    在使用SpringMvc的时候,配置文件中我们经常看到 annotation-driven 这样的注解,其含义就是支持注解,一般根据前缀 tx.mvc 等也能很直白的理解出来分别的作用.<tx: ...

  3. mybatis example使用 and和or联合查询(转)

    这两天项目用到ibatis,碰到and or的联合查询,语句像这样的 select * from table where xxx = "xxx" and (xx1="xx ...

  4. .net Ajax使用

    function CheckUsername() { var strName = $("#txtUserName").val(); $.ajax({ type: "GET ...

  5. SpringBoot基础梳理

    1.入口类和@SpringBootApplication注解: SpringBoot通常有一个名为*Application的入口类,入口类里面有main方法,我们可以通过启动main方法启动sprin ...

  6. 多系统重装其中Win7后的启动引导列表恢复

    重装Win7后会导致原grub引导被覆盖,要修复grub需要一张Ubuntu的LiveCD(安装光盘),用LiveCD启动电脑,进入Try Ubuntu(试用Ubuntu),进入之后打开终端,做如下几 ...

  7. oracle 基础(上)

    sql  语句氛围以下三种类型: dml:Date Manipulation Language 数据操纵语言 DDL:Data Definition Language 数据定义语言 DCL:Data ...

  8. python——模块和包 需要注意的地方

    一 模块 1.import import module: 将执行文件(module)的目录路径插入到sys.path的第一个位置 执行时: 1.创建新的名称空间 2.执行被调用的模块 第二次调用,不会 ...

  9. css基础知识之属性选择器

    css属性选择器及属性和值选择器如下: <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  10. Ngnix+tomcat负载均衡

    系统环境 Centos6.5 nginx1.4.7  https://nginx.org/download/nginx-1.4.7.tar.gz tomcat7.0.79 http://apache. ...