遇到指针别害怕!先把这篇笔记看一遍~("轻松掌握指针:先读这篇笔记,告别恐惧!")
原创
一、指针简介
指针是C语言中的一个核心概念,它是内存地址的抽象描述。领会指针对于深入掌握C语言至关重要。本文将带你轻松掌握指针的使用,告别恐惧。
二、指针的基本概念
指针本质上是一个变量,用于存储另一个变量的内存地址。在C语言中,我们可以通过取地址符(&)来获取一个变量的内存地址。
int a = 10;
int *p = &a;
在上面的代码中,p
是一个指针变量,它存储了变量 a
的内存地址。
三、指针的运算
指针可以进行以下几种运算:
- 指针与整数相加减
- 指针与指针相减
- 指针的递增和递减
下面是一个指针运算的示例:
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;
// 指针与整数相加
p += 2;
printf("%d ", *(p)); // 输出 3
// 指针与整数相减
p -= 2;
printf("%d ", *(p)); // 输出 1
// 指针的递增
p++;
printf("%d ", *(p)); // 输出 2
// 指针的递减
p--;
printf("%d ", *(p)); // 输出 1
四、指针与数组
指针与数组有着密切的关系。在C语言中,数组名实际上是一个指向数组首元素的指针。我们可以使用指针来访问数组元素。
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;
for (int i = 0; i < 5; i++) {
printf("%d ", *(p + i)); // 输出 1 2 3 4 5
}
此外,我们还可以使用指针遍历多维数组:
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int (*p)[4] = arr;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", *(*(p + i) + j)); // 输出 1 2 3 4 5 6 7 8 9 10 11 12
}
}
五、指针与函数
指针在函数中的应用非常广泛。我们可以通过指针传递变量的地址,从而在函数内部修改变量的值。
void addOne(int *p) {
(*p)++; // 修改变量的值
}
int main() {
int a = 10;
addOne(&a);
printf("%d ", a); // 输出 11
return 0;
}
此外,指针还可以作为函数的返回值,返回一个指向动态分配内存的指针。
int *createArray(int size) {
int *arr = (int *)malloc(size * sizeof(int));
if (arr == NULL) {
return NULL; // 内存分配落败
}
return arr;
}
int main() {
int *arr = createArray(5);
if (arr == NULL) {
return 1; // 内存分配落败
}
// 使用数组...
free(arr); // 释放内存
return 0;
}
六、指针与结构体
指针在结构体中的应用也非常广泛。我们可以使用指针来访问结构体的成员,以及动态分配结构体变量的内存。
typedef struct {
int x;
int y;
} Point;
Point *createPoint(int x, int y) {
Point *p = (Point *)malloc(sizeof(Point));
if (p == NULL) {
return NULL; // 内存分配落败
}
p->x = x;
p->y = y;
return p;
}
int main() {
Point *p = createPoint(10, 20);
if (p == NULL) {
return 1; // 内存分配落败
}
printf("(%d, %d) ", p->x, p->y); // 输出 (10, 20)
free(p); // 释放内存
return 0;
}
七、指针的高级应用
指针的高级应用包括函数指针、指针数组、指向指针的指针等。这些概念虽然纷乱,但掌握后能大大减成本时间编程能力。
八、总结
指针是C语言的核心概念之一,虽然初学者也许会感到困惑,但只要掌握基本原理和常见用法,就能轻松应对。通过本文的学习,相信你已经告别了指针的恐惧,起初享受编程的乐趣。