指针和数组
指针地址和数组地址
c
#include <stdio.h>
int main(void)
{
int arr[] = {5, 1, 2, 'a', 'b', 'c'};
// 数组名是一个常量不允许赋值
// arr = 10; // err
int *p = arr; // arr首个元素地址赋值给 p
// 地址[下标] 是一样的
printf("%d\n", arr[0]);
printf("%d\n", p[0]);
printf("%d\n", *p); // arr存的也是首元素地址,输出的也是 arr[0] 的值
printf("%d\n", *arr); // *地址 输出也是一样的
// 数组本身存储的也是内存中的偏移量
// 指针类型变量+1 等同于 内存地址+sizeof(int)
printf("%d\n", *(arr+0)); // arr[0]的地址
printf("%d\n", *(arr+1)); // arr偏移
printf("%d\n", *(arr+2)); // arr偏移
p++; // p 的地址加了 int 的内存大小
// 相差一个 int 类型大小
printf("%p\n", arr);
printf("%p\n", p);
// 所有的指针类型相减结果都是 int
int step = p - arr;
printf("%d\n", step);
return 0;
}
类型大小
c
#include <stdio.h>
int main(void)
{
int arr[] = {5, 1, 2, 'a', 'b', 'c'};
int *p = arr;
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(p)); // 只是指针类型的变量
fun(arr);
return 0;
}
// arr1 相当于是指针类型变量
// int fun(int arr1[])
// 相当于
int fun(int *arr1)
{
printf("arr1 size: %d\n", sizeof(arr1));
return 0;
}
指针数组
c
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 3;
// 定义指针数组
int *arr[3] = {&a, &b, &c};
printf("%d\n", *arr[0]); // 1
printf("指针数组字节大小:%d\n", sizeof(arr));
printf("指针数组元素大小:%d\n", sizeof(arr[0]));
return 0;
}