关于C语言指针(通俗易懂,不间断更新)

早就听老前辈讲指针是C语言的灵魂,指针就是这么个神奇的东西,当你以为自己指针掌握的还不错的时候,下一秒可能就被它的一个变形难住,最近在看一本Kenneth A.Reek写的《C与指针》,感叹以前对指针的理解还是太过肤浅,以下是我的一些小总结。

在我看来,理解一个指针无非是要知道三个问题

①我是谁

②我在哪

③我指向谁

 

举个例子,假如:

char p='a'                        //假设声明了p后,p在内存的0x01处,则&p=0x01(&为取变量首地址)

char * p1=&p                  //则p1= 0x01,*p1=p=' a',p1就和p关联了;假设p1被放在0xa1处

char ** p2=&p1              //则p2= 0xa1,*p2=p1=&p= 0x01,**p2=&p1=p='a'

 

【一】

①const char *ptr: 不能用ptr来修改所指向的内容

②char const *ptr: 效果同①

③char *const ptr: 不能修改ptr所存放的地址值

 

【二】

char str[] = "hello";

char *p = str;

p[i]中存放的是变量,

p+i 是一个指针,

所以p[i] =*(p+i)      p+i中存放的是p[i]的地址

 

【三】

一维数组

int num[5] = {1,2,3,4,5};

int *ap = num + 2;                      ap --------> num[2](第三个元素)

对等表达式,表格中每一行表示的意义相同

 

printf("%d",*((int*)(&num+1)-1));    打印结果:5

&num+1:指向下一行的行首(当然此处不存在)

(int*)(&num+1)-1:向前移一个int大小,即指向元素5的地址
 

num[subscript]   等价于   *(array + (subscript)),subscript可以是一个数,也可以是一个求值表达式

 

【四】

二维数组

int a[2][3] = {1,2,3,4,5,6};

 

*(*(a+1)+1)相当于a[1][1];

分析:

*(a+1) 等价  a[1]  等价 &a[1][0]

故*(a+1)+1相当于&a[1][1]

 

不同于一维数组,这里a并不是一个指向整型的指针,而是一个指向整数数组的指针

可以把二维数组看成一维数组,int a[2][3] <------>int xxx[] = {★1,★2,★3}

只是这个一维数组每一个元素★都是一个入口地址,★2表示一维数组{ a[1][0],a[1][1],a[1][2] }的入口地址,即★2 = &a[1][0]

 

【五】

数组指针(是一个指针):

int  (*p1)[2]    p1指向一个内含两个int类型值的数组

指针数组(是一个数组):

int  *p2[2]      p2是一个内含两个指针元素的数组,每一个元素都是指向int类型的指针

 

 

 

关于二维数组指针表示,C语言指针引用二维数组详解

http://c.biancheng.net/view/227.html

目录 第1章 一大波数正在靠近——排序 1 第1节 zui快zui简单的排序——桶排序 2 第2节 邻居好说话——冒泡排序 7 第3节 zui常用的排序——快速排序 12 第4节 小哼买书 20 第2章 栈、队列、链表 25 第1节 解密QQ号——队列 26 第2节 解密回文——栈 32 第3节 纸牌游戏——小猫钓鱼 35 第4节 链表 44 第5节 模拟链表 54 第3章 枚举!很暴力 57 第1节 坑爹的奥数 58 第2节 炸弹人 61 第3节 火柴棍等式 67 第4节 数的全排列 70 第4章 wan能的搜索 72 第1节 不撞南墙不回头——深度优先搜索 73 第2节 解救小哈 81 第3节 层层递进——广度优先搜索 88 第4节 再解炸弹人 95 第5节 宝岛探险 106 第6节 水管工游戏 117 第5章 图的遍历 128 第1节 深度和广度优先究竟是指啥 129 第2节 城市地图——图的深度优先遍历 136 第3节 zui少转机——图的广度优先遍历 142 第6章 zui短路径 147 第1节 只有五行的算法——Floyd-Warshall 148 第2节 Dijkstra算法——通过边实现松弛 155 第3节 Bellman-Ford——解决负权边 163 第4节 Bellman-Ford的队列优化 171 第5节 zui短路径算法对比分析 177 第7章 神奇的树 178 第1节 开启“树”之旅 179 第2节 二叉树 183 第3节 堆——神奇的优先队列 185 第4节 擒贼先擒王——并查集 200 第8章 更多精彩算法 211 第1节 镖局运镖——图的zui小生成树 212 第2节 再谈zui小生成树 219 第3节 重要城市——图的割点 229 第4节 关键道路——图的割边 234 第5节 我要做月老——二分图zui大匹配 237 第9章 还能更好吗——微软亚洲研究院面试 243 啊哈算法 目 录 第1章 编程改变思维 1 第1节 为什么要学习编程 1 第2节 本书是讲什么的,写给谁看的 4 第2章 梦想启航 7 第1节 编程的魔力 7 第2节 让计算机开口说话 9 第3节 多彩一点 18 第4节 让计算机做加法 21 第5节 数字的家――变量 26 第6节 数据输出――我说咋地就咋地 31 第7节 数据输入――我说算啥就算啥 33 第8节 究竟有多少种小房子 37 第9节 拨开云雾见月明 40 第10节 逻辑挑战1:交换小房子中的数 42 第11节 天啊!这怎么能看懂 45 等等。。。。。。。。。。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值