C语言中指针*p[N], (*P)[N],及**p的区别
在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的区别的更多相关文章
- C语言中指针占据内存空间问题
以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...
- 这样子来理解C语言中指针的指针
友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...
- C语言中指针和数组
C语言数组与指针的那些事儿 在C语言中,要说到哪一部分最难搞,首当其冲就是指针,指针永远是个让人又爱又恨的东西,用好了可以事半功倍,用不好,就会有改不完的bug和通不完的宵.但是程序员一般都有一种迷之 ...
- Go语言中的有缓冲channel和无缓冲channel区别
Go语言中的有缓冲channel和无缓冲channel区别 结论 ch1:=make(chan int)// 无缓冲 ch2:=make(chan int,1)// 有缓冲 无缓冲: 当向ch1中存值 ...
- 理解C语言中指针的声明以及复杂声明的语法
昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...
- 编程基础-c语言中指针、sizeof用法总结
1.指针 学习 C 语言的指针既简单又有趣.通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的. ...
- C语言中指针和多维数组
指针和多维数组 数组名是特殊的指针 数组是一个特殊的指针,多维数组也是更为复杂的数组,它们的关系是什么样的呢? 我们通过一个简单的例子来比较形象的了解指针和多维数组: int a[2][3]; 这是一 ...
- C语言中整形数组、字符数组、字符串的区别
一. 第一 整型数组的存放,数组最后是不加'\0'的,字符串会自动加上,因此存放字符的时候数组的大小要比实际字符的多一个 第二 整型数组 每一个单元是4个字节的,字符串是一个一个字符存放的,每个字符占 ...
- 对C语言中指针的一些新认识
学C语言这么久了,才发现指针不是想象中那么简单,当初根本就没理解指针怎么用! 变量--是由操作系统自动分配存储空间的 指针--手动分配存储空间或指向已有变量的地址 指针中的内容需要手动释放,而变 ...
随机推荐
- Android中的内容提供者
Android中的内容提供者 为什么需要内容提供者 为了跨程序访问数据.试想如果在App-1中创建了一个私有数据库,App-2是不能直接访问的.因为权限不够,虽然可以使用chmod 777来修改权限, ...
- Uva 679 Dropping Ballls 二叉树的编号
这个程序常规处理起来数据量很大,I可以高达2^D-1 /* ....... */ 里面的代码块据此避免了开太大的数组 做太多的循环 #include<cstdio> #include< ...
- 使用Nginx搭建本地流媒体服务器
Mac搭建nginx+rtmp服务器 1.打开终端,查看是否已经安装Homebrew,直接输入命令 man brew 如果Mac已经安装了, 会显示一些命令的帮助信息. 此时输入Q退出即可, 直接进入 ...
- VMware Workstation Pro 安装centos6.5
先要安装好VMware Workstation Pro破解版本,下载好centos系统.iso光盘映像文件,本人下载的是CentOS-6.5-i386-bin-DVD1.iso 添加新的虚拟主机可以通 ...
- 67. Add Binary【LeetCode】
67. Add Binary Given two binary strings, return their sum (also a binary string). For example,a = &q ...
- linux 编译安装详解
相信大家大多都听过linux 的编译安装,但它到底是怎么把源代码变为自己电脑里可以应用的软件哪?今天,小编就以httpd 为例详细讲解一下. 什么是编译安装--编译:将源代码变为机器可执行的代码文件. ...
- Java入门——(2)面对对象(上)
关键词:面对对象.类..构造方法.this.static.内部类 一.面对对象的概念:把解决的问题安装一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题.其特点可概括为封装性.继承 ...
- Git基础命令的使用
当前git版本: git version 2.9.2.windows.1 1.创建一个能与git服务器连接的本地git库 本地: git init git status (-s) git add . ...
- javascript面向对象属性函数用法(defineProperty与getOwnPropertyDescriptor)
defineProperty用于设置一个对象的属性描述符,属性描述符有4个:[[Configurable]], [[Enumerable]], [[Writable]],[[Value]] 当一个属性 ...
- C# foreach循环较for循环的优势与劣势
一.foreach循环的优势 C#支持foreach关键字,foreach在处理集合和数组相对于for存在以下几个优势: 1.foreach语句简洁 2.效率比for要高(C#是强类型检查,for循环 ...