提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量
提出一个问题:我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?
准确的说:有的
int num = 10;
p = #
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
提示:以下是本篇文章正文内容,下面案例可供参考
指针是一种变量,其值为内存地址。通过指针,程序可以直接访问内存中的数据。指针提供了对内存的灵活访问
#include <stdio.h>
int main() {
int x = 15; // 一个整数
int* ptr = &x; // 整数指针,存储 x 的地址
printf("y = %d\n", ptr);
printf("y = %d\n", *ptr);
int y = *ptr;
return 0;
}
这样子更好理解
指针类型定义了指针所指向的数据类型。类型决定了指针的解引用方式
int x = 10;
int *ptr = &x; // 整数指针
char c = 'A';
char *charPtr = &c; // 字符指针
野指针是未初始化或已释放的指针。使用野指针可能导致程序错误。初始化指针并确保它指向有效的内存区域是重要的。
举例子:
int *wildPtr; // 未初始化的指针
int *releasedPtr = malloc(sizeof(int));
free(releasedPtr); // 已释放的指针
指针运算包括指针加法、减法和比较。这些运算用于访问内存中的不同位置。
int arr[] = {1, 2, 3, 4, 5};
int *ptr = arr;
printf("%d\n", *(ptr + 2)); // 输出 arr[2] 的值
指针与数组密切相关,数组名可以视为指向数组第一个元素的指针。
int arr[] = {1, 2, 3};
int *ptr = arr;
printf("%d\n", *ptr); // 输出 arr[0] 的值
二级指针是指向指针的指针,用于操作指针的指针。
int x = 10;
int *ptr = &x;
int **doublePtr = &ptr;
printf("%d\n", **doublePtr); // 输出 x 的值
指针数组是一个数组,其元素都是指针。可以用于存储字符串等数据。
char *names[] = {"Alice", "Bob", "Charlie"};
printf("%s\n", names[1]); // 输出 "Bob"
数组指针是指向数组的指针,可以用于遍历数组。
int arr[] = {1, 2, 3};
int (*arrPtr)[3] = &arr;
printf("%d\n", (*arrPtr)[1]); // 输出 arr[1] 的值
提个问题
#include <stdio.h>
int main()
{
int arr[10] = {0};
printf("%p\n", arr);
printf("%p\n", &arr);
return 0;
}
所以他们一样吗?
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
printf("arr = %p\n", arr);
printf("&arr= %p\n", &arr);
printf("arr+1 = %p\n", arr+1);
printf("&arr+1= %p\n", &arr+1);
return 0;
}
输出结果
根据上面的代码我们发现,其实&arr和arr,虽然值是一样的,但是意义应该不一样的。
实际上: &arr 表示的是数组的地址,而不是数组首元素的地址。
本例中 &arr 的类型是: int(*)[10] ,是一种数组指针类型
数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40
数组作为函数参数时,其实传递的是数组的地址,可以通过指针访问数组
void printArray(int *arr, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
}
int main() {
int arr[] = {1, 2, 3};
printArray(arr, 3);
return 0;
}
void printMatrix(int (*matrix)[3], int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
int main() {
int matrix[][3] = {{1, 2, 3}, {4, 5, 6}};
printMatrix(matrix, 2, 3);
return 0;
}
int (*matrix)[3] 是一个指向包含3个整数的数组的指针。
级指针作为函数参数,可以用于修改调用者传递的变量。
void updateValue(int *x) {
*x = *x + 1;
}
int main() {
int value = 10;
updateValue(&value);
printf("%d\n", value); // 输出 11
return 0;
}
二级指针传递地址,允许在函数内修改指针指向的值。
void updatePointer(int **ptr) {
int newValue = 20;
*ptr = &newValue;
}
int main() {
int value = 10;
int *ptr = &value;
updatePointer(&ptr);
printf("%d\n", *ptr); // 输出 20
return 0;
}