C语言指针笔记

打印 上一主题 下一主题

主题 870|帖子 870|积分 2610

该笔记整理自 阮一峰老师的《C语言教程》和部分网上资料
什么是指针

指针就是一个代表某个内存地址的值
声明和初始化指针变量
  1. int a = 10;
  2. // 声明一个指针变量p,并将a的地址赋给p
  3. int* p = &a;
  4. // 输出p的值(地址值)
  5. printf("%p", p);
  6. // 输出p所指向的值
  7. printf("%d", *p);
复制代码
这个*可以放在数据范例和变量名之间的任意位置,比如int * p;,int *p;等等,不过为了体现p是一个指针变量,建议int* p;
%p占位符表示一个指针变量
野指针

野指针通常指的是那些指向了一个已释放的内存区域、未分配的内存区域、或者指向了不可访问的内存区域的指针
野指针怎样产生的?
指针变量未经初始化,则该指针会随机指向一个内存地址,因此应该只管给指针变量初始化,如果不知道该赋啥值,就赋NULL值
指针所指向的空间被释放掉了,如果某个指针指向的空间被释放了,应该立即将该指针指向NULL
数组越界访问
指针与数字加减

一般用于数组指针或者字符串指针
  1. int* p = (int*) 0x100;
  2. p += 2; // 此时p的值为0x108,因为指针偏移量和其数据类型一致,int类型的指针偏移量为4
复制代码
利用指针遍历打印数组里的元素
  1. int arr[] = {1, 2, 3, 4, 5};
  2. int* p = arr; // 此时p指向arr的第一个元素1
  3. for (int i = 0; i < sizeof(arr) / sizeof(int); i ++) {
  4.   printf("%d\n", *p);
  5.   p ++;
  6. }
复制代码
指针之间的加减

指针之间的加法是违法的,会报错
但是相同范例的指针之间的减法是合法的
  1. int* p1 = (int*) 0x1009;
  2. int* p2 = (int*) 0x1000;
  3. int dist = p1 - p2; // dist的值为3
  4. // 分析:因为 0x1009 - 0x1000 = 9
  5. // int占4字节,所以 9 / 4 = 2 ... 1,多出来1位,这个多出来的1位被包含在第三个int元素里,所以dist值为3
复制代码
但是dist可能会超过int的范围,所以为了程序的健壮性,建议这么写
  1. #include <stddef.h>
  2. int main() {
  3.   int* p1 = (int*) 0x1009;
  4.   int* p2 = (int*) 0x1000;
  5.   ptrdiff_t dist = p1 - p2;
  6.   return 0;
  7. }
复制代码
ptrdiff_t范例专门被设计用来表示两个指针之间的距离的,利用这种范例之前,必要引入stddef.h
踩雷日志

交换两个变量的值,错误代码:
  1. int change(int x, int y) {
  2.   int* xp = &x;
  3.   int* yp = &y;
  4.   *xp = *xp ^ *yp;
  5.   *yp = *xp ^ *yp;
  6.   *xp = *xp ^ *yp;
  7. }
复制代码
错误点:忘记基本数据范例的传参方式为值传递,即 新开一个空间,将值赋值进去,再让参数指向新的空间
正确代码:
  1. int change(int* x, int* y) {
  2.   *x = *x ^ *y;
  3.   *y = *x ^ *y;
  4.   *x = *x ^ *y;
  5. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表