C语言指针笔记

cnblogs 2024-07-19 08:09:04 阅读 63

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

什么是指针

指针就是一个代表某个内存地址的值

声明和初始化指针变量

<code>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

数组越界访问

指针与数字加减

一般用于数组指针或者字符串指针

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;

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。