深入理解指针(3)——C语言

深入理解指针(3)——C语言

一、字符指针变量

在指针的类型中我们知道有一种指针类型为字符指针char*
一般使用:

int main()
{
  char ch = 'w';
  char *pc = &ch;
  *pc = 'h';
  return 0;
}

这是一种常规用法,还有另一种:

nt main()
{
  const char* pstr = "hello world.";
  printf("%s\n", pstr); 
  return 0;
}

这种用法特别容易让小白误解成是将字符串"hello world."整个放到pstr变量中去了,其实不然,它是将字符串"hello world."中首元素字符"h"地址放到pstr中去了,因为内存中地址是连续的,顺藤摸瓜就能找到整个字符串。
而且常量字符串是不能被修改的,所以相同的常量字符串在内存中只会存一份~
我们验证一下:

#include <stdio.h>
int main()
{
   const char* str1 = "hello world.";
   const char* str2 = "hello world.";
   if (str1 == str2)
       printf("str1 and str2 are same\n");
   else printf("str1 and str2 are not same\n");
   return 0;
}

在这里插入图片描述
事实证明我们的猜想完全正确!
那么,存放在数组中的相同的字符串是否存的是一份呢?我们再来验证一下:

#include <stdio.h>
int main()
{
   char str1[] = "hello world.";
   char str2[] = "hello world.";
   if (str1 == str2)
       printf("str1 and str2 are same\n");
   else printf("str1 and str2 are not same\n");
   return 0;
}

在这里插入图片描述
这里我们可以看出,地址是不一样的,也就是说:即使数组中存放的是相同的字符串,计算机也会开辟出不同的内存去储存它们。这点差异大家要记清楚~

二、数组指针变量

1.什么是数组指针变量?

没什么神秘的哈哈哈,数组指针变量就是存放数组地址指针
那怎么书写呢?这里要注意写法。

int (*p)[10];

p先和*结合,说明p是一个指针变量变量,然后指着指向的是一个大小为10个整型的数组。

2.数组指针的初始化

数组指针变量是用来存放数组地址的,那怎么获得数组的地址呢?那就是**&数组名**,取出的就是整个数组的地址

int arr[10] = {0};
&arr;//得到的就是数组的地址
int(*p)[10] = &arr;

简而言之,数组指针就是存放数组地址的指针
那我弱弱的问一句,数组指针是数组还是指针?废话!数组指针当然是指针啊!

三、函数指针变量

什么是函数指针?答:函数指针就是存放函数地址指针变量。
我们来演示一下:

#include <stdio.h>
int Add(int x, int y)
{
  return x + y;
}
int main()
{
  int (*pf)(int, int) = Add;
  //int (*pf)(int, int) = &Add; &可写可不写,函数名也是函数的地址
  return 0;
}
int (*pf)(int, int)

其中,第一个int 代表函数的返回类型,(int, int) 中的两个int 分别表示函数的两个形参类型,(*pf)就表示它是一个指针。
那我们来举一反三:

void test(int* p, char ch, float f)
{
  ;
}

存放这个函数的函数指针类型应该怎么写呢?

void (*pf)(int* , char, float) = test;

OK.你是否明白了呢?

四、函数指针数组

前面我们介绍了函数指针,那如果我们想把一组函数指针存起来怎么办呢?这就需要用到函数指针数组了。
注:但这里有一个前提,函数指针数组中存放的函数指针必须是同一类型的。
接下来我们正文开始:

#include <stdio.h>
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};
  return 0;
}
int(*p[4])(int, int)

函数指针数组的写法很简单,就是在函数指针变量名的后面加上 [数组元素个数]。
比如上面的例子:
函数指针数组中每个函数指针的类型是:

int (*pf)(int, int)

一共有四个元素,只需要在函数指针变量名的后面加上 [数组元素个数]:

int(*p[4])(int, int)

你明白了吗?
那我们再弱弱的问一句:函数指针数组是什么?是函数?是指针?是数组?
不卖关子了,函数指针数组数组

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值