1.数组名的理解
数组名就是首元素的地址,但是有两个例外:
sizeof(数组名)计算的是整个数组的大小
&数组名,取得的地址是整个数组的地址
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[6] = { 1,2,3,4,5,6 };
printf("arr = %p\n", arr);
printf("&arr[0] = %p\n", &arr[0]);
printf("arr+1 = %p\n", arr+1);
printf("&arr[0]+1 = %p\n", &arr[0]+1);
printf("&arr = %p\n", &arr);
printf("&arr+1 = %p\n", &arr+1);
printf("sizeof(arr) = %d\n", sizeof(arr));
return 0;
}
输出结果
arr = 00D5F930
&arr[0] = 00D5F930
arr+1 = 00D5F934
&arr[0]+1 = 00D5F934
&arr = 00D5F930//16进制,30=3*16=48,
&arr+1 = 00D5F948//16进制,48=4*16+8=72, 72-48=24
sizeof(arr) = 24
2.指针访问数组
访问数组就不再局限于下标引用操作符了 [ ]
如下都相互等价
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[6] = { 0 };
int* p = arr;
for (int i = 0; i < 6;i++)
{
//scanf("%d", &arr[i]);
//scanf("%d", arr + i);
//scanf("%d", p + i);
scanf("%d", &p[i]);
}
for (int i = 0; i < 6; i++)
{
//printf("%d ", arr[i]);
//printf("%d ", *(arr + i));
//printf("%d ", *(p + i));
printf("%d ", p[i]);
}
return 0;
}
结论:本质上p[i] 是等价于 *(p+i)
3.一维数组转参的本质
平时遇到,有人写个函数打印数组是这样写的:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void Print(int arr[])
{
int len = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[6] = { 1,2,3,4,5 };
int* p = arr;
Print(arr);
return 0;
}
输出结果为:1
此时我们意识到这样不对,传递实参arr是首元素地址,所以输出首元素1。因为函数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。
#include<stdio.h>
void printArr(int* p,int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", p[i]);
}
}
int main()
{
int arr[6] = { 1,2,3,4,5 ,6 };
int len = sizeof(arr) / sizeof(arr[0]);
printArr(arr,len);
return 0;
}
输出1 2 3 4 5 6
4.指针数组
指针数组是指针还是数组?
整形数组,整形数组,存放整形的数组,是数组
那指针数组,也是数组,存放指针的。后面还有数组指针哟~
5.二级指针
存放指针变量的地址
#include<stdio.h>
int main()
{
int a = 100;
int* pa = &a;
int* *ppa = &pa;
**ppa = 666;
printf("a = %d\n", a);//a=666
return 0;
}
6.指针数组模拟二维数组
#include<stdio.h>
int main()
{
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d ", arr[i][j]);
//arr[i] 等价于 *(arr+i)
//printf("%d ", *(arr[i] + j));
//printf("%d ", *(*(arr+i)+j));
}
printf("\n");
}
return 0;
}