技术盲点:
1)数组首元素的地址和数组地址是两个不同的概念
2)数组名代表数组首元素的地址,不是整个数组的地址
例如a[10],a表示首元素的地址,&a才表示整个数组的地址。
a和&a代表的数据类型不一样。&a代表数组类型。a代表数组元素类型。
数组类型:typedef int(MYINT5)[5];
typedef float(MYFLOAT10)[10];
数组定义:MYINT5 iArray;
MYFLOAT10 fArray;
void main()
{
typedef int(MyArr5)[5];
int i;
MyArr5 array5; // 用数据类型定义一个变量 相当于int array5
for (i = 0; i < 5; i++)
{
array5[i] = i + 1;
}
for (i = 0; i < 5; i++)
{
printf("%d \n",array5[i]);
}
printf("%d\n", sizeof(array5));
printf("%d %d\n", &array5, &array5 +1);
printf("%d %d\n", array5, array5 +1);
system("pause");
}
数组指针:
void main()
{
int a;
int *p = NULL;
int i = 0;
//绳命了一个数组类型(固定大小内存块的别名)
typedef int(MyArr5)[5];
// 定义一个指向数组类型的指针变量
MyArr5 *array5;
{
// a1代表数组首元素的地址(不是整个数组的地址),
<span style="white-space:pre"> </span>// a1是常量指针,不能随便的改变指针变量的值(该变指向)
<span style="white-space:pre"> </span>// 为什么它是一个const?
<span style="white-space:pre"> </span>// a1在定义a[5]的时候,编译器分配内存,为了有机会让编译器拿到原始的内存首地址,
<span style="white-space:pre"> </span>// 编译器就把a1做成const常量。
<span style="white-space:pre"> </span>// 不能深入了解c指针的各种现象是产生bug的根源
int a1[5] = {1,3,4,55,6};
MyArr5 *pArray = &a1;
// d
for (; i < 5; i++)
{
printf("%d",(*pArray)[i]);
}
}
system("pause");
}
可以用typedef声明数组指针类型
{
// 直接定义一个数组指针类型 用这个类型定义指针变量
// 声明了一个数组类型(固定大小内存块的别名)
typedef int (*pMyArr5)[5];
pMyArr5 myP = NULL;
int b[5] = {1,3,4,55,6};
myP = &b;
for (i = 0; i < 5; i++)
{
printf("%d ", (*myP)[i]);
}
}
直接定义指向数组的指针变量
{
int c[5] = {1,3,4,55,6};
// 直接出来一个指向数组的指针变量
int (*myarray)[5] = &c;
for (i = 0; i < 5; i++)
{
printf("%d ",(*myarray)[i]);
}
}
数组和数组指针东西真多,先记录这些基本的语法,之后在慢慢梳理吧,有些乱,我也有点凌乱了