015. 声明和初始化指针
在C语言中,指针是一种特殊的变量,用于存储另一个变量的内存地址。声明和初始化指针是C语言编程中的重要概念。以下将详细介绍如何声明和初始化指针,以及如何使用指针访问和修改变量的值。
1. 声明指针
声明指针时,需要指定指针所指向的变量类型。指针的声明格式如下:
类型 *指针变量名;
示例1:声明一个指向整数的指针
int *ptr; // 声明一个指向整数的指针
2. 初始化指针
指针可以通过以下几种方式初始化:
- 将指针初始化为
NULL
:表示指针不指向任何有效的内存地址。 - 将指针初始化为某个变量的地址:使用
&
运算符获取变量的地址。 - 将指针初始化为动态分配的内存地址:使用
malloc
或calloc
函数分配内存。
示例2:将指针初始化为NULL
int *ptr = NULL; // 声明并初始化为NULL
示例3:将指针初始化为某个变量的地址
int num = 10;
int *ptr = # // 声明并初始化为变量num的地址
示例4:将指针初始化为动态分配的内存地址
int *ptr = (int *)malloc(sizeof(int)); // 动态分配一个整数大小的内存
if (ptr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
*ptr = 10; // 通过指针访问并修改动态分配的内存
3. 使用指针访问和修改变量的值
指针可以通过*
运算符来访问和修改它所指向的变量的值。
示例5:使用指针访问和修改变量的值
#include <stdio.h>
int main() {
int num = 10; // 声明一个整数变量
int *ptr = # // 声明一个指针并初始化为num的地址
printf("Value of num: %d\n", num); // 输出num的值
printf("Value of num via pointer: %d\n", *ptr); // 通过指针访问num的值
*ptr = 20; // 通过指针修改num的值
printf("Value of num after modification: %d\n", num); // 输出修改后的值
return 0;
}
输出结果
Value of num: 10
Value of num via pointer: 10
Value of num after modification: 20
4. 指针的指针
指针也可以指向另一个指针。这种情况下,需要使用多个*
来声明和访问。
示例6:指针的指针
#include <stdio.h>
int main() {
int num = 10; // 声明一个整数变量
int *ptr = # // 声明一个指针并初始化为num的地址
int **ptrPtr = &ptr; // 声明一个指针的指针并初始化为ptr的地址
printf("Value of num: %d\n", num); // 输出num的值
printf("Value of num via pointer: %d\n", *ptr); // 通过指针访问num的值
printf("Value of num via pointer of pointer: %d\n", **ptrPtr); // 通过指针的指针访问num的值
**ptrPtr = 20; // 通过指针的指针修改num的值
printf("Value of num after modification: %d\n", num); // 输出修改后的值
return 0;
}
输出结果
Value of num: 10
Value of num via pointer: 10
Value of num via pointer of pointer: 10
Value of num after modification: 20
5. 指针数组
指针数组是一个数组,其中的每个元素都是一个指针。
示例7:指针数组
#include <stdio.h>
int main() {
int a = 10, b = 20, c = 30;
int *ptrArray[3]; // 声明一个指针数组,包含3个指针
ptrArray[0] = &a; // 将第一个指针初始化为a的地址
ptrArray[1] = &b; // 将第二个指针初始化为b的地址
ptrArray[2] = &c; // 将第三个指针初始化为c的地址
printf("Value of a: %d\n", *ptrArray[0]); // 通过指针数组访问a的值
printf("Value of b: %d\n", *ptrArray[1]); // 通过指针数组访问b的值
printf("Value of c: %d\n", *ptrArray[2]); // 通过指针数组访问c的值
*ptrArray[1] = 25; // 通过指针数组修改b的值
printf("Value of b after modification: %d\n", *ptrArray[1]); // 输出修改后的值
return 0;
}
输出结果
Value of a: 10
Value of b: 20
Value of c: 30
Value of b after modification: 25
6. 动态分配的指针数组
可以使用malloc
或calloc
动态分配指针数组。
示例8:动态分配的指针数组
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptrArray[3]; // 声明一个指针数组,包含3个指针
int size = 3;
for (int i = 0; i < size; i++) {
ptrArray[i] = (int *)malloc(sizeof(int)); // 动态分配内存
if (ptrArray[i] == NULL) {
printf("Memory allocation failed\n");
return 1;
}
*ptrArray[i] = (i + 1) * 10; // 初始化动态分配的内存
}
for (int i = 0; i < size; i++) {
printf("Value at index %d: %d\n", i, *ptrArray[i]); // 通过指针数组访问值
}
// 释放动态分配的内存
for (int i = 0; i < size; i++) {
free(ptrArray[i]);
}
return 0;
}
输出结果
Value at index 0: 10
Value at index 1: 20
Value at index 2: 30
视频讲解
BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)