📜  C指针(1)

📅  最后修改于: 2023-12-03 14:40:25.822000             🧑  作者: Mango

C指针

简介

指针是C语言的重要概念之一,它为我们提供了对内存的直接访问能力。在C语言中,指针可以指向任何数据类型的变量,包括基本数据类型、数组、结构体等,它可以实现函数传参、动态内存分配、数组访问等诸多功能。

指针的定义

指针变量是用来存储内存地址的变量,可以使用“*”来声明一个指针变量。例如:

int *p;

这里声明了一个指向整型变量的指针变量p。指针变量的类型必须与其指向的变量类型相同或兼容。

指针的初始化

指针变量定义后需要进行初始化,将其指向某个变量的内存地址。例如:

int a = 10;
int *p = &a;

这里将指针变量p指向变量a的内存地址。

指针的访问

指针变量可以通过“*”来访问其指向的变量。例如:

int a = 10;
int *p = &a;
*p = 20;
printf("%d\n", a); // 输出结果为20

这里通过指针变量p修改了变量a的值,输出结果为20。

指针的运算

指针变量支持加减运算,可以实现对数组的访问。例如:

int a[5] = {1, 2, 3, 4, 5};
int *p = a;
for (int i = 0; i < 5; i++) {
    printf("%d ", *p++);
}
// 输出结果为1 2 3 4 5

这里通过指针变量p遍历了数组a,并输出了其元素。

指针的传参

指针变量可以作为函数参数进行传递,实现对函数外部变量的修改。例如:

void swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
int main() {
    int a = 1, b = 2;
    swap(&a, &b);
    printf("%d %d\n", a, b); // 输出结果为2 1
    return 0;
}

这里定义了一个swap函数用于交换两个整型变量的值,通过指针变量实现变量值的交换。

指针的空指针

指针变量可以赋值为NULL,表示其不指向任何有效地址。例如:

int *p = NULL;

这里将指针变量p赋值为NULL。

指针的野指针

指针变量未初始化时会成为野指针,访问其值将会导致程序崩溃。例如:

int *p;
printf("%d\n", *p); // 野指针访问,将会导致程序崩溃
指针的类型转换

指针变量可以进行强制类型转换,但需要注意类型的兼容性。例如:

int a = 10;
int *p = &a;
char *c = (char *)p; // 强制类型转换
printf("%c\n", *c); // 输出结果为:疯(由于编译器对内存的管理方式不同,结果可能会不同)

这里将指针变量p强制转换为字符型指针变量c,并输出其指向的值,由于编译器对内存的管理方式不同,结果可能会不同。

指针与数组

数组名可以被当作指针使用,指向其第一个元素的地址。例如:

int a[5] = {1, 2, 3, 4, 5};
int *p = a;
for (int i = 0; i < 5; i++) {
    printf("%d ", *p++);
}
// 输出结果为1 2 3 4 5

这里将数组名a赋值给指针变量p,并通过指针变量p遍历了数组a,并输出了其元素。

指针与字符串

字符串实际上就是一个字符数组,可以用字符型指针变量指向其第一个字符的地址。例如:

char *str = "hello";
printf("%s\n", str); // 输出结果为hello

这里将字符串常量hello赋值给字符型指针变量str,并输出其指向的字符串。

总结

指针是C语言中的重要概念之一,它提供了对内存的直接访问能力,可以实现函数传参、动态内存分配、数组访问等诸多功能。通过指针变量的定义、初始化、访问、运算、传参、空指针、野指针、类型转换、数组访问、字符串操作等多个方面的介绍,希望可以更好地理解指针在C语言中的作用和使用。