详解 万恶之源——指针(3)

本篇文章主要讲解字符指针变量、数组指针变量和函数指针变量及其延申的内容。

一.字符指针变量

​
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用来对类型重命名
typedef  unsigned int  uint;  //普通类型
typedef  int*  pt;            //指针类型
typedef  int(*p)[2];          //数组指针类型
typedef  void(*p)(int);       //函数指针类型
3.函数指针数组

函数指针数组就是把函数的地址存入数组

定义就是函数指针上改动:int (*p[3])(int)   。

以上就是本篇的全部内容了,创造不易,如果喜欢的话点个赞,点个关注^-^

谢谢大家^_^

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值