印度小哥讲解的指针, 真的很好, 这里附上链接:
https://www.bilibili.com/video/BV1bo4y1Z7xf/?spm_id_from=333.999.0.0
1. 数组在内存中
1.1 数组在内存中
1.2 数组和基本数据类型在内存中存储
这两种存储方式是不同的, 数组是连续的空间, 可以通过指针的跳转直接知道数组中下一个地址中存储的值,
但是基本数据类型不可以, 不知道相邻的值是什么.
1.3 指针在数组的应用 (地址和值)
从这段代码中可以发现数组中表示第“i”位置的地址或者值
表示地址:1. &A[i]
或者 A + i
;
表示值:1. A[i]
或者 *(A + i)
;
// A
的地址和 A[0]
的地址是一样的, 所以数组的首元素地址又被称为数组的“基地址”
int main() {
int A[5];
A[0] = 2;
A[1] = 4;
A[2] = 5;
A[3] = 8;
A[4] = 1;
int* p = &A[0];
int* q = A;
printf("A[0]的地址为:%p\n", p);
printf("A[0]的值为:%d\n", *p);
printf("A[1]的地址为:%p\n", p + 1); // 从这段代码中可以发现数组中表示第“i”位置的地址或者值
printf("A[1]的值为:%d\n", *(p + 1)); // 表示地址:1. &A[i] 或者 A + i;
printf("A的地址为:%p\n", q); // 表示值:1. A[i] 或者 *(A + i);
printf("A[1]的地址为:%p\n", q + 1);
printf("A[1]的值为:%d\n", *(q + 1));
}
int main() {
int arr[] = { 2, 4, 5, 8, 1 };
int i;
for (int i = 0; i < 5; i++) {
printf("arr[%d]对应的地址为:%p\n", i, arr + i);
printf("arr[%d]对应的地址为:%p\n", i, &arr[i]);
printf("arr[%d]对应的值为:%d\n", i, *(arr + i));
printf("arr[%d]对应的值为:%d\n", i, arr[i]);
}
return 0;
}
1.4 利用指针获得数组内存地址
也可以创建 指针变量
对数组的内存地址进行存储, 但是不能直接将 arr++
, 可以将 p++
;
int main() {
int arr[] = { 2, 4, 5, 8, 1 };
int i;
int* p = arr;
p++;
// arr++;
for (int i = 0; i < 5; i++) {
printf("arr[%d]对应的地址为:%p\n", i, arr + i);
printf("arr[%d]对应的地址为:%p\n", i, &arr[i]);
printf("arr[%d]对应的值为:%d\n", i, *(arr + i));
printf("arr[%d]对应的值为:%d\n", i, arr[i]);
}
return 0;
}
2. 这节课主要是学习了什么
- 数组在内存中的存储形式
- 如何获得数组的地址
- 如何使用指针获得数组的内存