一.指针
void*指针
它是一个非常包容的指针,可接受任意类型的地址,但是不能直接用*访问,需要先进行强制类型转换才能解引用。
整形指针 :int*
字符指针:char*
const char* pstr = "hello bit.";//本质是把字符串 hello bit. 首字符的地址放到了pstr中。
printf("%s\n", pstr);//打印字符串
printf("%c\n", * pstr);//打印h
注:因为常量字符串不可以修改,所以定义时可以加上const,const表明pstr指针所指向的内容不可修改.
观察下面一组代码,判断str1与str2是否相等,str3与str4是否相等
char str1[] = "helloword";
char str2[] = "helloword";
const char *str3 = "helloword";
const char *str4 = "helloword";
原因是在C/C++中会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。
二.指针数组(一个存放指针的数组)
int* arr1[10]; //整形指针的数组
char *arr2[4]; //字符指针的数组
char **arr3[5];//二级字符指针的数组
三.数组指针
能够指向数组的指针,即把数组的地址放入指针中
例如:int arr[10]={1,2,3,4,5};
int (*pa)[10] = &arr //取的是数组的地址 int(*)[10] -> 数组指针类型
四.函数指针
int (*p)(int x,int y) = &Add;//p为函数指针变量
用p调用函数Add: int sum = (*p)(3,5); //可有可无色
(*(void (*)())0)();
这个表示把0强制转换成一个void(*)()的函数指针,然后去调用0地址处的函数
五.函数指针数组
把函数的地址存到一个数组中,那这个数组就叫函数指针数组
定义:int (*parr1[10])();//是一个int(*)()类型的函数指针
六.指向函数指针数组的指针
它是一个指针,指针指向一个数组,数组的元素都是函数指针;
//函数指针pfun
void (*pfun)(const char*) = test;
//函数指针的数组pfunArr
void (*pfunArr[5])(const char* str);
pfunArr[0] = test;
//指向函数指针数组pfunArr的指针ppfunArr
void (*(*ppfunArr)[5])(const char*) = &pfunArr;
遇到数组与指针时请注意
数组名是数组首元素的地址,除以下两种情况:
一:sizeof(数组名),sizeof内部单独放一个数组名,数组名表示整个数组。计算的是整个数组的大小。
二:&数组名,取出的是整个数组的地址。数组名表示整个数组。
&(arr+1) 取地址时跳过数组
arr[i]=*(arr+i)
&a[0]==a
&a[1]==a+1