C语言指针学习笔记
目录
1. 地址与指针的概念
- 地址:内存单元的编号(如变量占用的第一个字节的地址)。
- 指针:变量的地址,指针变量是专门存储地址的变量。
- 两种数据存取方式:
- 直接存取:通过变量名访问(如
a=3
)。 - 间接存取:通过指针访问(如
*p=3
)。
int a = 10;
int *p = &a;
printf("%d", *p);
2. 指针变量的定义与使用
定义格式
数据类型 *指针变量名;
指针运算符
&
:取地址(如 &a
)。*
:解引用(如 *p
表示p指向的值)。
示例
int a = 10, b = 20;
int *p1 = &a, *p2 = &b;
int *temp = p1;
p1 = p2;
p2 = temp;
printf("max=%d, min=%d", *p1, *p2);
3. 指针与数组
数组名与指针
- 数组名是数组首元素的地址(如
int a[5]; a == &a[0]
)。 - 指针遍历数组:
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
for (; p < a + 5; p++) {
printf("%d ", *p);
}
多维数组
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));
4. 指针与字符串
字符指针 vs 字符数组
- 字符数组:元素可修改,但不能整体赋值。
- 字符指针:可直接指向字符串常量(不可修改内容)。
char str[] = "Hello";
char *p = "World";
字符串复制示例
char src[] = "Hello";
char dest[10];
char *p1 = src, *p2 = dest;
while (*p1 != '\0') {
*p2++ = *p1++;
}
*p2 = '\0';
printf("%s", dest);
5. 函数指针
定义与使用
int max(int a, int b) { return a > b ? a : b; }
int (*p)(int, int) = max;
printf("%d", p(3, 5));
函数指针作为参数
void calculate(int a, int b, int (*func)(int, int)) {
printf("Result: %d", func(a, b));
}
calculate(3, 5, max);
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);
7. 动态内存分配
常用函数
int *p = (int*)malloc(5 * sizeof(int));
if (p != NULL) {
for (int i = 0; i < 5; i++) p[i] = i;
free(p);
}
8. 本章小结
- 指针本质是地址,指针变量存储地址。
- 指针与数组:数组名是常量指针,指针可高效遍历数组。
- 字符串操作:字符指针灵活,但需注意常量不可修改。
- 函数指针:实现回调函数和动态调用。
- 动态内存:使用后需手动释放,避免内存泄漏。
- 安全提示:避免野指针和越界访问。