int* ptr; // 声明一个整型指针变量ptr
char* cptr; // 声明一个字符型指针变量cptr
int num = 10;
int* ptr = # // 将ptr指向num的地址
int num = 10;
int* ptr = #
int value = *ptr; // 解引用ptr,获取指针所指向地址处的值
int* ptr = (int*)malloc(sizeof(int)); // 在堆上分配一个整型变量大小的内存空间
*ptr = 20; // 将值20存储到ptr所指向的内存地址处
free(ptr); // 释放动态分配的内存空间
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr; // 将指针ptr指向数组的第一个元素
int value = *(ptr + 2); // 通过指针进行偏移,访问数组中的第三个元素
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int num1 = 10;
int num2 = 20;
swap(&num1, &num2);
//指针数组 数组里存放指针。
int num1 = 10;
int num2 = 20;
int num3 = 30;
int* ptrArr[3]; // 声明一个指针数组,包含3个指针元素
ptrArr[0] = &num1; // 将第一个指针指向num1的地址
ptrArr[1] = &num2; // 将第二个指针指向num2的地址
ptrArr[2] = &num3; // 将第三个指针指向num3的地址
// 通过指针数组访问对应的值
printf("%d\n", *ptrArr[0]); // 输出:10
printf("%d\n", *ptrArr[1]); // 输出:20
printf("%d\n", *ptrArr[2]); // 输出:30
//数组指针,指向数组的指针。
int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5]; // 声明一个指向包含5个整型元素的数组的指针
ptr = &arr; // 将指针指向数组arr的首地址
// 通过数组指针遍历数组并访问对应的值
for (int i = 0; i < 5; i++) {
printf("%d\n", (*ptr)[i]); // 输出:1 2 3 4 5
}
//多级指针:
#include <stdio.h>
int main() {
int num = 10;
int* ptr = #
int** ptr2 = &ptr; // 声明一个指向指针的指针
printf("Value of num: %d\n", num);
printf("Value of *ptr: %d\n", *ptr);
printf("Value of **ptr2: %d\n", **ptr2);
return 0;
}
//二维数组的指针
#include <stdio.h>
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int (*ptr)[4]; // 声明一个指向包含4个整型元素的一维数组的指针
ptr = arr; // 将指针指向二维数组的首行(第一个一维数组)
// 使用指针遍历二维数组并访问对应的值
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", *(*(ptr + i) + j)); // 输出二维数组的值
}
printf("\n");
}
return 0;
}
数组指针和指针数组分不清楚的可以这样记,重要的信息放在前面,数组指针,数组里还是数。指针数组,数组里放的是指针。
多级指针:
**head head是地址,*head是head地址对应的数据。如果*head对应的数据还是一个地址那么再*(*head)就是*head地址对应的数据,地址可以看作是寻找数据的索引。如果head地址对应的数据不是地址,那么*head会获取head地址对应的数据,如果此时再*(*head)相当于*(任意数),*head不是地址会报错。