1. 指针的含义及基本用法
在C语言中,指针是一个非常重要的概念,它是一个值为内存地址的变量。在一些情况下,直接操作变量并不能完成我们的需求,需要使用指针来操作内存。
1.1 指针变量的声明
指针变量的声明与其他类型的变量有所不同,需要在变量名前加上*符号:
int* p; //声明一个指向int类型的指针变量p
这里的*不是指针运算符,只是用来修饰变量的类型。也可以同时声明多个指针变量:
int *p, *q; //声明两个指向int类型的指针变量p和q
1.2 指针变量的赋值
指针变量需要指向一个有效的内存地址才能使用,常用的赋值方式有以下几种:
1. 直接赋值:
int a = 100;
int* p = &a; //将指针变量p指向a的内存地址
2. 通过其他指针变量赋值:
int a = 100;
int* p = &a; //将指针变量p指向a的内存地址
int* q = p; //将指针变量q指向p指向的内存地址,也就是a的内存地址
3. 运算符&取地址:
int a = 100;
int* p = &a; //将指针变量p指向a的内存地址
1.3 通过指针访问内存
指针变量指向的是一个内存地址,通过指针访问内存的方式有以下几种:
1. 解引用运算符*:
int a = 100;
int* p = &a; //将指针变量p指向a的内存地址
*p = 200; //将a的值修改为200
2. 数组名作为指针使用:
int a[3] = {1, 2, 3};
int* p = a; //将指针变量p指向数组a的首地址,即a[0]的地址
*p = 10; //将a[0]的值修改为10
p++; //将指针变量p指向数组a的下一个元素,即a[1]的地址
2. 指针和函数
指针和函数结合使用,可以完成一些高级的功能。
2.1 函数指针
函数指针指向的是函数的入口地址,可以通过它来调用函数。
函数指针的声明和使用如下所示:
int add(int a, int b) {
return a + b;
}
int (*p)(int, int); //声明一个指向add函数的指针变量p
p = &add; //将指针变量p指向add函数的入口地址
int c = (*p)(1, 2); //通过指针变量p调用add函数,计算1+2的结果,并将结果赋值给变量c
2.2 指向指针的指针
指向指针的指针可以用来传递指针变量的地址,以便在函数中修改指针的指向。
指向指针的指针的声明和使用如下所示:
void swap(int** p, int** q) {
int* tmp = *p;
*p = *q;
*q = tmp;
}
int a = 1, b = 2;
int* p = &a, *q = &b;
swap(&p, &q); //将变量p和q指向的内存地址交换
3. 指针和字符数组
C语言中,字符串实际上是一个字符数组(字符串常量除外),可以用指针来访问字符串。
3.1 字符串指针
字符串指针指向的是字符串的首地址,也就是字符数组的第一个元素的地址。
字符串指针的声明和使用如下所示:
char* str = "Hello, world!";
for (int i = 0; i < strlen(str); i++) {
printf("%c ", *(str + i)); //依次输出字符串中的每个字符
}
3.2 字符数组的指针
字符数组的指针指向的是整个字符数组。
字符数组的指针的声明和使用如下所示:
char str[20] = "Hello, world!";
char* p = str; //将指针变量p指向字符数组str的首地址
for (int i = 0; i < strlen(str); i++) {
printf("%c ", *(p + i)); //依次输出字符串中的每个字符
}
4. 指针和结构体
结构体是用来存储一组相关数据的数据类型,可以使用指针来访问结构体的成员。
4.1 结构体指针
结构体指针指向结构体的首地址。
结构体指针的声明和使用如下所示:
struct Student {
char name[20];
int age;
};
struct Student stu = {"Tom", 18};
struct Student* p = &stu;
printf("%s %d", (*p).name, (*p).age); //使用指向结构体的指针来访问结构体成员
上述代码中,指针变量p指向结构体变量stu的首地址,通过*p来获取结构体的值后再用.来访问结构体的成员。
4.2 结构体成员指针
结构体成员指针指向结构体成员的地址。
结构体成员指针的声明和使用如下所示:
struct Student {
char name[20];
int age;
};
struct Student stu = {"Tom", 18};
int* p = &stu.age; //将指针变量p指向结构体变量stu的age成员的地址
*p = 20; //修改结构体变量stu的age成员的值为20
总结
本文主要详细介绍了指针在C语言中的含义、基本用法,以及指针和函数、字符数组、结构体的组合使用。指针是C语言中非常重要的概念,掌握指针的使用能够帮助我们更加高效地操作内存,完成我们的需求。