一.数组名的理解
总结:
- 数组名就是首元素的的地址,即arr==&arr[0]。不过该说法有两个例外:sizeof(数组名) 和&数组名中表示的是取出整个数组的地址。除此之外,都表示的是首元素的地址。
1.使用指针访问数组
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int* p = arr;
for (int i = 0; i < sz; i++)
{
scanf("%d", p + i);
}
for (int i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
2.一维数组传参的本质
本质上数组传参的本质是传递的是数组首元素的地址。
#include <stdio.h>
void test(int* p)
{
printf("%d", sizeof(p));//计算的是一个指针变量的大小
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
test(arr);
return 0;
}
故,一维数组传参,形参的部分可以写成数组的形式,也可以写成数组的形式。
3.二维数组传参的本质
二维数组传参的本质就是传递了地址,传递是第一行这个一维数组的地址。
PS:二维数组的传参,形参部分可以写成数组,也可以写指针的形式。
#include <stdio.h> void test(int(*p)[5], int r, int c)//这里的地址就是二维数组首行元素的地址 { for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { printf("%d ", *(*(p + i) + j)); } printf("\n"); } } int main() { int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} }; test(arr, 3, 5); return 0; }
二.二级指针
PS:指针变量也是变量,是变量就有地址。一级指针变量的地址就是用二级指针存储的。
#include <stdio.h>
int main()
{
int a = 10;
int* p1 = *&a;
int** p2 = &p1;
return 0;
}
三.字符指针变量
字符指针类型 char*.
一般使用:
#include <stdio.h> int main() { char ch = 'w'; char* p = &ch; *p = 'a'; printf("%c", ch); return 0; }
四.指针数组,数组指针变量
对于字符指针和数组指针用类比的方法:
1.整型数组,是存放整型的数组;字符数组是存放字符的数组。
那么指针数组就是存放指针的数组,指针数组的每个元素都是用来存放地址(指针)的。
指针数组的每个元素是地址,又可以指向一块区域。eg:int *arr[5].
2.数组指针变量属于指针,同样我们由类比的方法可以知道数组指针变量存放的是数组的地址,能够指向数组的指针变量。eg:int (*arr)[5].
这里要注意:
[ ]的优先级要高于*号的,所以必须加上()来保证arr先和*结合。
1.指针数组
使用指针数组模拟二维数组
#include <stdio.h>
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
int* parr[3] = { arr1,arr2,arr3 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", parr[i][j]);
}
printf("\n");
}
return 0;
}
2.数组指针
数组指针类型解析:
1 int (*) [10] = &arr;
2 | | |
3 | | |
4 | | p指向数组的元素个数
5 | p是数组指针变量名
6 p指向的数组的元素类型
五.函数指针变量,函数指针数组
函数指针变量就是用来存储函数的地址的,函数指针数组就是将函数的地址放在数组中。
函数指针变量:
int (*p) (int x,int y)
| | |
| | p指向函数的参数类型和个数的交代
| 函数指针变量
p指向函数的返回值类型
#include <stdio.h> void add(int x, int y) { return x + y; } int main() { int (*p)(int, int) = add; printf("%d\n", (*p)(2, 3)); printf("%d\n", p(2, 3));//这两种的调用方式是等价的 return 0; }
函数指针数组:
eg:int (*arr[3]) ( )
p先和[ ]结合,说明是数组,数组的内容是int (*) ( )类型的函数指针。