int a;
int b[10] ;
变量a称为标量,因为它是个单一的值,这个变量的类型是一个整数。
数组名b的值是一个指针常量,也就是数组第一个元素的地址
数组具有确定数量的元素,而指针只是一个标量值
sizeof求数组长度时:
int a[5]
求得数组长度5*4 int为4个字节
一级指针指向一级指针的话
int b = 6;
int *p, *a=&b;
p = a;
printf("%d %d %d %d %d", p,*p,&a,*a,&b);
会打印出b的地址,如果p是二级指针会打印指针a的地址,
二级指针指向一级指针求值需要两个接引用符‘*’;
int arr[5] = { 1,12,12,2,3 };
int b = 6;
printf(" %d %d %d %d %d ",arr, arr+3, arr[3], *arr+3, *(arr+3));
分别打印数组arr[0]地址,a[3]地址,a[3]的值2,先取值1再加3,a[3]的值;
指针数组: 元素都是指针的数组;
定义格式: int a = 3; int a[10]; int *a[10];
数组指针:
int a[10][10];
int (*p)[10] = a; //int **p = a;
a[i][j] = ((p + i) + j) = p[i][j]
[] 下标运算符 * 解引用 &引用(地址符)
int p; //整形变量
int *p; //指向整形变量的指针变量(指针)
int p[]; //整形数组
int *p[5]; //指向整形变量的指针的数组(指针数组)
int (*p)[5]; //指向每一行有5列的数组的指针(数组指针)
int p(){}; //返回值为整形的函数
int (*p)(); //指向上面↑这种类型函数的指针(函数指针)
int (*p[4])(); //存放↑这种类型指针的数组(函数指针数组)
int (*)[5] p(){}; //返回71行类型的指针数组的函数(数组指针函数)
int* p(){}; //返回值为指针类型的函数(指针函数)
int* (*p)(); //指向76行这种类型的函数的指针(指针函数指针)
int* (*p[5])(); //装有5个77行这种类型的指针的数组(指针函数指针数组)
数组指针
int arr[10][10];
int (*p)[10]=arr;
二维数组第一个下标运算符填的是行数,因为a[10][10],每行有10列这样的格式,
这是一个数组指针,每个指针指向了每行的首地址,一共十行;
int (*p)[5]; //指向每一行有5列的数组的指针(数组指针)
指针数组
int *p[5]; //指向整形变量的指针的数组(指针数组)
指针数组:是一个承载着指针的数组它的所有成员都是指针
int *a[5];
int b=4;
int c=1;
a[0] = &b;
a[1] = &c;
输出 4,1;
数组指针的打印
char arr[5] = { 1,12,12,2,3 };
int brr[10][10];
int (*p)[10] = brr;
for (int a=0;a<10;++a)
{
for (int j = 0; j < 10; ++j)
{
brr[a][j] = j;
printf("%d ",brr[a][j]);
}
}
putchar('\n');
for (int i=0; i<100; ++i)
{
printf("%d ", (*p)[i]);
}
二维数组需要两个下标才能找到数组的值,如果只用一个参数那它就是一个指针,只会打印地址;