C语言指针学习笔记

C语言指针学习笔记

目录


1. 地址与指针的概念

  • 地址:内存单元的编号(如变量占用的第一个字节的地址)。
  • 指针:变量的地址,指针变量是专门存储地址的变量。
  • 两种数据存取方式
    • 直接存取:通过变量名访问(如 a=3)。
    • 间接存取:通过指针访问(如 *p=3)。
int a = 10;
int *p = &a; // p存储a的地址
printf("%d", *p); // 输出a的值:10

2. 指针变量的定义与使用

定义格式

数据类型 *指针变量名; // 如 int *p;
  • 注意:指针的基类型必须与指向变量的类型一致。

指针运算符

  • &:取地址(如 &a)。
  • *:解引用(如 *p 表示p指向的值)。

示例

int a = 10, b = 20;
int *p1 = &a, *p2 = &b;
// 交换指针指向(不改变a和b的值)
int *temp = p1;
p1 = p2;
p2 = temp;
printf("max=%d, min=%d", *p1, *p2); // 输出max=20, min=10

3. 指针与数组

数组名与指针

  • 数组名是数组首元素的地址(如 int a[5]; a == &a[0])。
  • 指针遍历数组:
int a[5] = {1, 2, 3, 4, 5};
int *p = a; // p指向数组首地址
for (; p < a + 5; p++) {
    printf("%d ", *p); // 输出1 2 3 4 5
}

多维数组

  • 二维数组的指针表示:
int a[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int (*p)[4] = a; // 行指针
printf("%d", *(*(p+1)+2)); // 输出第2行第3列的值:7

4. 指针与字符串

字符指针 vs 字符数组

  • 字符数组:元素可修改,但不能整体赋值。
  • 字符指针:可直接指向字符串常量(不可修改内容)。
char str[] = "Hello"; // 可修改str[0] = 'h'
char *p = "World";    // p[0] = 'w' 是非法的

字符串复制示例

char src[] = "Hello";
char dest[10];
char *p1 = src, *p2 = dest;
while (*p1 != '\0') {
    *p2++ = *p1++;
}
*p2 = '\0'; // 添加结束符
printf("%s", dest); // 输出Hello

5. 函数指针

定义与使用

int max(int a, int b) { return a > b ? a : b; }
int (*p)(int, int) = max; // 定义函数指针
printf("%d", p(3, 5));    // 输出5

函数指针作为参数

void calculate(int a, int b, int (*func)(int, int)) {
    printf("Result: %d", func(a, b));
}
calculate(3, 5, max); // 输出Result: 5

6. 指针数组与多重指针

指针数组

char *names[] = {"Alice", "Bob", "Charlie"};
for (int i = 0; i < 3; i++) {
    printf("%s\n", names[i]);
}

双重指针

int a = 10;
int *p = &a;
int **pp = &p; // 指向指针的指针
printf("%d", **pp); // 输出10

7. 动态内存分配

常用函数

  • malloc:分配内存。
  • free:释放内存。
int *p = (int*)malloc(5 * sizeof(int)); // 分配5个int空间
if (p != NULL) {
    for (int i = 0; i < 5; i++) p[i] = i;
    free(p); // 释放内存
}

8. 本章小结

  1. 指针本质是地址,指针变量存储地址。
  2. 指针与数组:数组名是常量指针,指针可高效遍历数组。
  3. 字符串操作:字符指针灵活,但需注意常量不可修改。
  4. 函数指针:实现回调函数和动态调用。
  5. 动态内存:使用后需手动释放,避免内存泄漏。
  6. 安全提示:避免野指针和越界访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值