C语言进阶课程学习记录-第29课 - 指针和数组分析(下)
- 数组名与指针
- 实验-数组形式转换
- 实验-数组名与指针的差异
- 实验-转化后数组名加一的比较
- 实验-数组名作为函数形参
- 小结
本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程,图片全部来源于课程PPT,仅用于个人学习记录
数组名与指针
实验-数组形式转换
#include <stdio.h>
int main()
{
int a[5] = {0};
int* p = a;
int i = 0;
for(i=0; i<5; i++)
{
p[i] = i + 1;
}
for(i=0; i<5; i++)
{
printf("a[%d] = %d\n", i, *(a + i));
}
printf("\n");
for(i=0; i<5; i++)
{
i[a] = i + 10;//可行
}
for(i=0; i<5; i++)
{
printf("p[%d] = %d\n", i, p[i]);
}
return 0;
}
/*
output:
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5
p[0] = 10
p[1] = 11
p[2] = 12
p[3] = 13
p[4] = 14
用指针+下标代替数组赋值,可行
*/
实验-数组名与指针的差异
//ext.c
int a[] = {1, 2, 3, 4, 5};
#include <stdio.h>
int main()
{
// extern int a[];//case1
/*
output:
&a = 00402000 //数组地址
a = 00402000 //首元素地址
*a = 1
*/
extern int *a;//case2
/*
output:
&a = 00402000
a = 00000001
*/
printf("&a = %p\n", &a);//
printf("a = %p\n", a);//1
printf("*a = %d\n", *a);//访问地址00000001 报错
return 0;
}
实验-转化后数组名加一的比较
#include <stdio.h>
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int* p1 = (int*)(&a + 1);
int* p2 = (int*)((int)a + 1);
int* p3 = (int*)(a + 1);
printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);
return 0;
}
/*
output:
小端 数据低位放在低地址中
01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
5 33554432 3
*/
实验-数组名作为函数形参
#include <stdio.h>
void func1(char a[5])
{
printf("In func1: sizeof(a) = %d\n", sizeof(a));
*a = 'a';
a = NULL;
}
void func2(char b[])
{
printf("In func2: sizeof(b) = %d\n", sizeof(b));
*b = 'b';
b = NULL;
}
int main()
{
char array[10] = {0};
func1(array);
printf("array[0] = %c\n", array[0]);
func2(array);
printf("array[0] = %c\n", array[0]);
return 0;
}
/*
output:
In func1: sizeof(a) = 4
array[0] = a
In func2: sizeof(b) = 4
array[0] = b
数组名作为函数形参会退化为指针
*/
小结
数组名与指针仅使用方式相同
数组名的本质不是指针;指针的本质不是数组
数组名并不是数组的地址,而是数组首元素的地址
函数的数组参数退化为指针