Skip to content

数组和指针

通过指针操作数组元素

  • 数组名字是数组的首元素地址,但它是一个常量
  • *[]效果一样,都是操作指针所指向的内存
c
#include <stdio.h>

int main() {
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int i = 0;
    int n = sizeof(a) / sizeof(a[0]);

    for (i = 0; i < n; i++) {
        // * 和 [] 效果一样,都是操作指针所指向的内存
        // printf("%d, ", a[i]);
        printf("%d, ", *(a + i));
    }
    printf("\n");

    // 定义一个指针变量保存 a 的地址
    int *p = a;
    for (i = 0; i < n; i++) {
        // printf("%d, ", p[i]);
        printf("%d, ", *(p + i));
    }
    printf("\n");

    return 0;
}

指针数组

指针数组,它是数组,数组的每个元素都是指针类型

c
#include <stdio.h>

int main() {
    // 指针数组
    int *p[3];
    int a = 1;
    int b = 2;
    int c = 3;

    // 指针变量赋值
    p[0] = &a;
    p[1] = &b;
    p[2] = &c;

    for (int i = 0; i < sizeof(p) / sizeof(p[0]); i++) {
        printf("%d, ", *(*(p + i)));
        // printf("%d, ", *(p[i]));
    }
    printf("\n");

    return 0;
}

数组名做函数参数

数组名做函数参数,函数的形参本质上就是指针

c
#include <stdio.h>

// 下面 3 种写法完全等价
// void print_arr(int a[10], int n)
// void print_arr(int a[], int n)
void print_arr(int *a, int n) {
    int i = 0;
    for (i = 0; i < n; i++) {
        printf("%d, ", a[i]);
    }
    printf("\n");
}

int main() {
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int n = sizeof(a) / sizeof(a[0]);

    // 数组名做函数参数
    print_arr(a, n);

    return 0;
}

函数参数传递数组

c
#include <stdio.h>
#include <stdint.h>

// 打印数组,三种写法皆可
// void print_arr(int arr[5], int size)
// void print_arr(int arr[], int size)
void print_arr(int * arr, int size) {
	// 对参数 arr 使用 sizeof,只会得到 int 指针的大小(固定为 8)
	// [警告] 'sizeof' on array function parameter 'arr' will \
	// return size of 'int *' [-Wsizeof-array-argument]
	printf("数组字节数:%d\n", sizeof(arr));

	// 数组以参数形式传递时,传递过来的是首元素地址,
    // 数组的长度信息丢失了,sizeof(arr) 得到的是指针的大小,\
    // 需要将数组的个数 size 从外部传进来
	for (int i = 0; i < size; i++) {
		printf("%d -> %d\n", i, *(arr + i));
	}
}

int main() {

	// 需求:编写一个函数,按格式打印数组
	int arr[] = {10, 20, 30, 40, 50};

	// 在声明函数的代码块,通过 sizeof(arr) 才能得到数组的字节占用数
	int size = sizeof(arr) / sizeof(arr[0]);

	print_arr(arr, size);

	return 0;
}

多维数组

c
#include <stdio.h>
#include <stdint.h>

// 二维数组,用于保存多组数据
int main() {
	// 一维数组:元素是数值
	int stu1[] = {18, 180, 100, 99};
	int stu2[] = {19, 170,  98, 99};
	int stu3[] = {20, 160,  90, 92};


	// 二维数组:元素是一维数组的指针
    // stus 是一个指针数组,每个元素指向一个一维数组。
    int * stus_arr[] = {stu1, stu2, stu3};

	// 第一个 [] 表示包含了几个一维数组
	// 第二个 [] 表示每个一维数组有几个元素
	int stus[][4] = {
		{18, 180, 100, 99},
		{19, 170,  98, 99},
		{20, 160,  90, 92},
	};

	printf("%d\n", stus[1][2]);
	printf("%d\n", *(stus[1] + 2));

	return 0;
}