数组与指针

本文实验环境:Linux x86-64,gcc (GCC) 11.2.0

1
2
3
4
5
6
7
#include <stdio.h>

int main() {
int arr[5] = { 1, 2, 3, 4, 5 };
printf("&arr[0] = %p,\t arr[0] = %d\n", &arr[0], arr[0]); // 对照组
printf("arr = %p,\t\t *arr = %d\n", arr, *arr); // 实验组
}

arr是一个指针变量,其值为数组中首个元素的地址

1
2
3
4
5
6
7
#include <stdio.h>

int main() {
int arr[5] = { 1, 2, 3, 4, 5 };
printf("arr = %p,\t\t *arr = %d\n", arr, *arr); // 对照组
printf("arr + 1 = %p,\t *(arr + 1) = %d\n", arr + 1, *(arr + 1)); // 实验组
}
  • arr + 1是将指针arr向后移动 1 个位置,指向数组的下一个元素

  • 由于数组元素的数据类型为 int,且sizeof(int) == 4

  • 所以

    • printf("%d", arr);输出 0x7fffcf5000c0

    • printf("%d", arr + 1);输出 0x7fffcf5000c4

1
2
3
4
5
6
7
#include<stdio.h>

int main() {
int arr[5] = { 1, 2, 3, 4, 5 };
printf("arr = %p,\t arr + 1 = %p\n", arr, arr + 1); // 对照组
printf("&arr = %p,\t &arr + 1 = %p\n", &arr, &arr + 1); // 实验组
}

image-20220406213615807

image-20220406221905290

  • 练习题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>

/**
* 工具函数
* 1. 输出指针变量中保存的地址
* 2. 指向的内存解读为 long,并以 16 进制 16 位的格式进行输出
*/
void printPtr(void * ptr) {
printf("ptr = %p, *ptr = %016lx\n", ptr, *(long *)ptr);
}

int main(int argc, char * argv[]) {
printPtr(argv); // 这是个指针变量
printPtr(&argv);

char * arr[5]; // 而这是个正儿八经的数组
printPtr(arr);
printPtr(&arr);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo(int brr[], int len) {
for (int i = 0; i < len; i ++) {
brr[i]++;
}
}

void main() {
int arr[] = { 1, 2, 3 }, len = sizeof(arr) / sizeof(arr[0]);
foo(arr, len);
for (int i = 0; i < len; i ++) {
printf("%d ", arr[i]);
}
printf("\n");
}

(完)