1、字符指针
char* p = "abcdef"→是把字符串首字符a的地址,赋值给了p
例:
int main()
{
const charp1 = "abcdef";
const charp2 = "abcdef";
char arr1[] = "abcdef";
char arr2[] = "abcdef";
if (p1 == p2)
printf("p1==p2");
else
printf("p1!=p2");
if (arr1 == arr2)
printf("arr1==arr2");
else
printf("arr1!=arr2");
return 0;
}
结果:p1 == p2
arr1 != arr2
2、指针数组
指针数组是数组
例如:int* arr1[10]→arr1是变量名,先向后结合,是数组,再向前看,每个元素int*类型
3、数组指针
数组指针是指针
例如:int (*arr)[]
数组名通常表示的都是数组首元素的地址,但有2个例外:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组大小
2.&数组名,这里的数组名表示的依然是整个数组
4、数组传参、指针传参
形参的二维数组,行可以省,列不能省!
二维数组的数组名,表示首元素的地址,其实是第一行的地址,第一行是一个一维数组
//这五种形式的形参均可
void test1(int arr[]);
void test1(int arr[10]);
void test1(int* arr);
void test2(int* arr[20]);
void test2(int** arr);
int main()
{
int arr1[10]={0};
int* arr2[20]={0};
test1(arr);
test2(arr2);
return 0;
}
一级指针传参
void print(int* p){}
int main()
{
int a=10;
int* ptr=&a;
int arr[10];
//这三种传参均可以
print(&a);
print(ptr);
print(arr);
retunr 0;
}
二级指针传参
void test(int** p){}
int main()
{
int* p1;
int** p2;
int* arr[10];
//这三种传参传参均可以
test(&p1);
test(p2);
test(arr);
return 0;
}
5.函数指针
函数指针是指针
例如:int (*ptr)()
对于函数来说,函数名和取函数名都是函数的地址
6.函数指针数组
函数指针数组是数组
例1:(*(void(*)())0)();
以上代码是一次函数调用,调用的是0作为地址处的函数
把0强制类型转换为:无参,返回类型是 void 的函数的地址
调用0地址处的这个函数
例2:void(*signal(int,void(*)(int)))(int);
signal 是函数名,以上代码是一次函数声明
声明的 signal 函数的第一个参数的类型是 int,第二个参数的类型是函数指针,该函数指针指向的函数参数是 int,返回类型是 void,signal 函数的返回类型也是一个函数指针,该函数指针指向的函数参数是 int,返回类型是 void
定义:int(*parr1[10])();parr1先和[]结合,是数组,数组内容是 int(*)()类型的函数指针
函数指针数组的用途:转移表
7.指向函数指针数组的指针
指向函数指针数组的指针是一个指针
指针指向一个数组,数组的元素都是函数指针
定义:int (*(*ppfArr)[5])(int,int) = &pfArr;
1151

被折叠的 条评论
为什么被折叠?



