C语言之指针进阶

  1. 字符串常量放在rodata段,相同的字符串只占一份内存空间。
    所以:
int *p1 = "hello!";
int *p2 = "hello!";
if(p1 == p2)  //正确;

  1. &数组名 与 数组名
    数组名:数组首元素的地址;
    &数组名:整个数组的地址;
int arr[10];
int *p3 = arr;
int (*p4)[10] = &arr;
  1. 数组名在两情况下代表整个数组:
    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); //第二行第二个元素的地址
  1. 存放数组指针的数组
int (*p[5])[4];

先找变量p[5]为数组;
在看类型int(* )[4];数组指针

  1. 函数指针
    函数名代表函数的地址
    函数指针:指向函数的指针
void test()
{
	printf("hhh");
}

void (*p)() = test;
  1. 判断下面两个表达式
    1).((void ()( )) 0 )(); //调用地址为0处,不带有参数且返回值为void的函数
2)  .void ( * signal ( int ,  void ( * ) ( int ))) (int);  //signal是一个函数,他有两个参数,一个是int一个是函数指针,函数的返回值为函数指针
  1. 利用typedef进行类型重命名,将复杂类型简单化,以用于理解
typedef void(*Fun)(int);
Fun signal(int , Fun);
  1. 定义一个指向函数指针数组的指针;
int *p1; //定义一个指针
int (*p2[10])();//定义一个函数指针数组
int (*(*p3)[10])(); //指向函数指针数组的指针

p3是一个指针,指向一个数组,数组是函数指针类型的

  1. 附上函数指针数组(转移表)的一道例题:
#inclue
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;
}

你可能感兴趣的:(C)