- 字符串常量放在rodata段,相同的字符串只占一份内存空间。
所以:
int *p1 = "hello!";
int *p2 = "hello!";
if(p1 == p2) //正确;
- &数组名 与 数组名
数组名:数组首元素的地址;
&数组名:整个数组的地址;
int arr[10];
int *p3 = arr;
int (*p4)[10] = &arr;
- 数组名在两情况下代表整个数组:
sizeof(arr);
&arr;
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d",arr); //二维数组首元素的地址。也就是第一行整个一维数组的地址
printf("%d",arr+1); //二维数组第二行的地址
printf("%d",arr[1]); //第二行首元素的地址,也就是arr[1][0]的地址
printf("%d",arr[1]+1); //第二行第二个元素的地址
- 存放数组指针的数组
int (*p[5])[4];
先找变量p[5]为数组;
在看类型int(* )[4];数组指针
- 函数指针
函数名代表函数的地址
函数指针:指向函数的指针
void test()
{
printf("hhh");
}
void (*p)() = test;
- 判断下面两个表达式
1).((void ()( )) 0 )(); //调用地址为0处,不带有参数且返回值为void的函数
2) .void ( * signal ( int , void ( * ) ( int ))) (int); //signal是一个函数,他有两个参数,一个是int一个是函数指针,函数的返回值为函数指针
- 利用typedef进行类型重命名,将复杂类型简单化,以用于理解
typedef void(*Fun)(int);
Fun signal(int , Fun);
- 定义一个指向函数指针数组的指针;
int *p1; //定义一个指针
int (*p2[10])();//定义一个函数指针数组
int (*(*p3)[10])(); //指向函数指针数组的指针
p3是一个指针,指向一个数组,数组是函数指针类型的
- 附上函数指针数组(转移表)的一道例题:
#inclue<stdio.h>
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int mul(int a,int b)
{
return a*b;
}
int div(int a,int b)
{
return a/b;
}
int main()
{
int (*p[4])(int,int) = {add,sub,mul,div};
printf("%d",(*p[1])(10,20));
return 0;
}