1.字符指针
const char* pstr = "hello"; //这里的pstr指针变量存的是字符‘h’的地址。
下面是一个例子:
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit."; //这里的str1和str2的地址是不相同的,str1 != str2
const char *str3 = "hello bit.";
const char *str4 = "hello bit."; //这里的str3和str4是指向同一个常量字符串,所以str3 == str4
return 0
2.指针数组
int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组
3.数组指针
数组指针是指向数组的指针。
例如
int (*p2)[10]; p2是一个指针,指向一个10个元素的整型数组。
并且数组名和&数组名也是不同的
int arr[10];
arr代表首个元素的地址,arr+1跳过到下一个元素地址。
&arr代表整个数组的地址,&arr+1跳过整个数组的地址。
int main()
{
int arr[3][5] = {{1,2,3,4,5},{6,7,8,9,10}};
//此处的arr代表首行数组的地址,即为数组指针。
int (*p)[5] = arr;//这是数组指针写法
return 0;
}
看如下代码含义:
int (*parr2)[10]; //parr2是一个数组指针,指向10个元素的数组每个元素是int型。
**int (*parr3[10])[5]; //数组parr3[10]的每个元素是一个指针,每个指针指向一个int[5]的数组。**
4.数组参数,指针参数
1.一维数组传参
void print(int* p);
void print(int arr[10]);
//这两种都可以传参
int arr[10] = {0};
print(arr);
2.二维数组传参
void print(int arr[2][5]);
void print(int (*arr)[5]);
//这两种也都可以
int arr[2][5] = {0};
print(arr);
3.一级指针传参
void print(int* p);
int a = 5;
int* p = &a;
print(p);
4.二级指针传参
void print(char** ppc);
char c = 'b';
char*pc = &c;
char**ppc = &pc;
print(ppc);
5.函数指针
void test()
{
printf("hehe\n");
}
void (*pfun1)() = test;//表示方法
6.函数指针数组
函数指针数组定义
int (*parr1[10])(); //数组parr1[10]每个元素为一个指针,指向int ()函数类型。
7. 指向函数指针数组的指针
void (*p[10])(char*) //函数指针数组定义
void (*(*pp)[5])(char*) //函数指针数组的指针定义