
C语言 指针例解
发布日期:2021-05-09 04:04:00
浏览次数:21
分类:博客文章
本文共 2306 字,大约阅读时间需要 7 分钟。
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)【用来指向该内存地址所对应的变量或数组】。指针一般出现在比较接近机器语言的语言,如汇编语言或C语言。面向对象的语言如Java一般避免用指针。指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的函数的值
本文侧重于通过几个例子,来解析指针。
数组和指针
1、
1 int a[5]={1,2,3,4,5};2 int *p=(int*)(&a+1);3 printf("%d\n",*(p-1));
/* a是一个数组名,也就是数组的首地址。 对a进行取地址运算符,得到的是一个指向数组的指针!!!!这句话尤为重要! 也就相当于 int (*p) [5] = &a; p=&a+1指向的是数组组a[4]的后面一个int单元, p-1指向a[4]=5 p是一个指针,它指向的是一个包含5个int元素的数组!! 那么执行p+1后,p的偏移量相当于 p + sizeof(int) * 5 !! 而程序中强制将指针p转换成一个int* 那么 p -1 其实就是 p - sizeof(int) 所以,p -1 指向了数组中得最后一个元素,也就是 5 */
2、
int a[]={1,2,3,4,5}; int*p[]={a,a+1,a+2,a+3}; int **q=p; printf("%d\n",*(p[0]+1)+**(q+2));
/* p[0]+1=a+1; *(p[0]+1)=2; *(q+2)=a+2; *(a+2)=3; 3+2=5; 其中p[0]=a也就是a[0]的地址, p[0]+1=a+1就是a[1]的地址, *(p[0]+1)就是a[1]的值就是2, **q=p --> *q=&p -->表示q保存的是p 的地址,q+2表示p[2]的地址,*(q+2)表示p[2], **(q+2)表示*p[2]表示*(a+2)就是a[2]的值就是3, 所以 *(p[0]+1)+**(q+2)=5 */
3、
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int (*pt)[4]=a; printf("%d\n",(*(pt+2))[2]);
/* 二维数组a[3][4]可以看做是{{1,2,3,4},{5,6,7,8},{9,10,11,12}}; (*(pt+2))[2]的值相当于 *(*(pt+2)+2) p[2]指向a[2]也就是a[2][0]的地址,所以p[2]+2指向a[2][2]的地址,其内容为11。 */
4、
int a[3][2]={1,2,3,4,5}; int *p[3]; p[0]=a[1]; printf("%d\n",*(p[0]+1));
// *(p[0]+1)所代表的数组元素是 a[1][1]
5、
static int a[]={5,4,3,2,1}; int *p[]={a+3,a+2,a+1,a}; int **q=p; printf("%d\n",*(p[0]+1)+**(q+2));
/* *(p[0] +1 ) = *( *(p+0) + 1) = *(a+3 +1) = a[4] = 1 **(q+2) = *(*(q+2) +0 ) =*( p[2]) = *(a+1) = 4; */
6、
int a[10]={1,2,3,4,5,6,7,8,9,10}; int *p=&a[3]; int b=p[5]; printf("%d\n",b);
/* a可以理解为这个数组的首地址 a[3]是指向第4个元素 所以p指向第4个元素 p[5]是从p后的5个 也就是第9个元素 所以b=9 */
7、
int a[2][3]={1,2,3,4,5,6}; int *p; p=a[0]; printf("%d\n",*(p+3));
// *(p+3)所代表的数组元素是 a[1][0];
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年03月26日 00时15分16秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
delete对象时会自动调用类的析构函数
2019-03-06
POD类型
2019-03-06
Head First设计模式——迭代器模式
2019-03-06
记一次讲故事机器人的开发-我有故事,让机器人来读
2019-03-06
netcore中使用session
2019-03-06
远程触发Jenkins的Pipeline任务的并发问题处理
2019-03-06
【wp】HWS计划2021硬件安全冬令营线上选拔赛
2019-03-06
Ef+T4模板实现代码快速生成器
2019-03-06
Java面试题:Servlet是线程安全的吗?
2019-03-06
Linux探测工具BCC(可观测性)
2019-03-06
采坑 - 字符串的 "" 与 pd.isnull()
2019-03-06
《你当像鸟飞往你的山》总结
2019-03-06
《我是猫》总结
2019-03-06
《抗糖化书》总结
2019-03-06
apache虚拟主机配置
2019-03-06
mcrypt加密以及解密过程
2019-03-06
go等待N个线程完成操作总结
2019-03-06
Python 之网络式编程
2019-03-06
python去除字符串中的特殊字符(爬虫存储数据时会遇到不能作为文件名的字符串)
2019-03-06