本篇文章主要讲解字符指针变量、数组指针变量和函数指针变量及其延申的内容。
一.字符指针变量
char arr[] = "asgaweg";
printf("%s\n", arr);
char* p1=&arr; //第一种定义方式
char* p2 = "showbngo"; //第二种定义方式
printf("%s%s", p1,P2); //打印字符串时只需传入首元素地址即可
字符指针变量可分为两种定义方式,二者输出的结果是相同的。两者的区别在于前者是数组字符串,后者是常量字符串。前者的字符串可以被更改,后者的字符串不能被更改。后者相当于在char*的前面加上了const来限制更改变量。
补充:常量字符串通常被存放到一个单独的内存空间,因此使用不同指针变量指向常字符串是他们指向的地址是相同的。如:
char* p1="abc";
char* p2="abc";
p1=p2成立。
二.数组指针
1.定义
这里要先区别数组指针和指针数组。
int* p[10]; //这是指针数组
int(*p)[10]; //这是数组指针
[ ]的优先级高于*,所以要表示数组指针时要加上括号。
指针数组本质是数组,存储的是地址。数组指针本质是指针,
int arr[2]={1,2};
int(*p)[2]=&arr;
p是一个真正变量,指向的是一个大小是2个整型的数组,简单来说就是p是一个指针,指向一个数组。
输出上述数组指针 *(*p+i) 。*p=arr,arr+i 再解引用。
2.二维数组传参的本质
二维数组其实可以看成一个每个元素是一维数组的数组。
void print(int arr[2][2], int l, int r)
{
}
int main()
{
int arr[2][2] = { 0 };
print(arr, 2, 2);
return 0;
}
二维数组传参的本质也是传递了地址,传递的地址是第一行一维数组的地址,第一行一维数组的类型是int(*)[2],因此我们在函数上可以这样写:
void print(int (*p)[2],int l,int r)
三.函数指针
1.定义
我们随便定义一个函数:
int f(int x)
类比数组名,函数名也可以表示函数的地址,但与数组不同的是,直接写 f 和 &f没有什么区别。
因此我们可以使用函数指针来存储函数的地址。
对于函数指针的使用:
*p(2) p(1)
上面两种使用都是可以的,*没有实际作用,你甚至可以写成这样********p(2)。
2.typedef关键字
typedef unsigned int uint; //普通类型
typedef int* pt; //指针类型
typedef int(*p)[2]; //数组指针类型
typedef void(*p)(int); //函数指针类型
3.函数指针数组
函数指针数组就是把函数的地址存入数组
定义就是函数指针上改动:int (*p[3])(int) 。
以上就是本篇的全部内容了,创造不易,如果喜欢的话点个赞,点个关注^-^
谢谢大家^_^