该笔记整理自 阮一峰老师的《C语言教程》和部分网上资料
什么是指针
指针就是一个代表某个内存地址的值
声明和初始化指针变量
int a = 10;
// 声明一个指针变量p,并将a的地址赋给p
int* p = &a;
// 输出p的值(地址值)
printf("%p", p);
// 输出p所指向的值
printf("%d", *p);
这个*
可以放在数据类型和变量名之间的任意位置,比如int * p;
,int *p;
等等,不过为了体现p
是一个指针变量,建议int* p;
%p
占位符表示一个指针变量
野指针
野指针通常指的是那些指向了一个已释放的内存区域、未分配的内存区域、或者指向了不可访问的内存区域的指针
野指针如何产生的?
指针变量未经初始化,则该指针会随机指向一个内存地址,因此应该尽量给指针变量初始化,如果不知道该赋啥值,就赋NULL
值
指针所指向的空间被释放掉了,如果某个指针指向的空间被释放了,应该立即将该指针指向NULL
数组越界访问
空指针
指向NULL
的指针就是空指针
指针与数字加减
一般用于数组指针或者字符串指针
int* p = (int*) 0x100;
p += 2; // 此时p的值为0x108,因为指针偏移量和其数据类型一致,int类型的指针偏移量为4
使用指针遍历打印数组里的元素
int arr[] = {1, 2, 3, 4, 5};
int* p = arr; // 此时p指向arr的第一个元素1
for (int i = 0; i < sizeof(arr) / sizeof(int); i ++) {
printf("%d\n", *p);
p ++;
}
指针之间的加减
指针之间的加法是违法的,会报错
但是相同类型的指针之间的减法是合法的
int* p1 = (int*) 0x1009;
int* p2 = (int*) 0x1000;
int dist = p1 - p2; // dist的值为3
// 分析:因为 0x1009 - 0x1000 = 9
// int占4字节,所以 9 / 4 = 2 ... 1,多出来1位,这个多出来的1位被包含在第三个int元素里,所以dist值为3
但是dist
可能会超过int
的范围,所以为了程序的健壮性,建议这么写
#include <stddef.h>
int main() {
int* p1 = (int*) 0x1009;
int* p2 = (int*) 0x1000;
ptrdiff_t dist = p1 - p2;
return 0;
}
ptrdiff_t
类型专门被设计用来表示两个指针之间的距离的,使用这种类型之前,需要引入stddef.h
踩雷日志
交换两个变量的值,错误代码:
int change(int x, int y) {
int* xp = &x;
int* yp = &y;
*xp = *xp ^ *yp;
*yp = *xp ^ *yp;
*xp = *xp ^ *yp;
}
错误点:忘记基本数据类型的传参方式为值传递,即 新开一个空间,将值赋值进去,再让参数指向新的空间
正确代码:
int change(int* x, int* y) {
*x = *x ^ *y;
*y = *x ^ *y;
*x = *x ^ *y;
}
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容