c语言中的指针是什么
admin
2023-02-14 15:00:07
0

本文以c语言中的指针为例,为大家分析c语言中的指针和常量的作用以及使用方法,阅读完整文相信大家对c语言中的指针和常量有了一定的认识。

指针的特性

指针和常量

先说下什么是常量,常量就是不可变的量,一旦定义该常量,其值在整个程序生命周期都是不可变的,常量存放在虚拟地址空间的常量区。

在C语言里面有两种定义常量的方法。

  • 使用const关键字 ,const 定义的是变量不是常量,只是这个变量的值不允许改变是常变量,带有类型。编译运行的时候起作用存在类型检查。

  • 使用#define预处理器, define 定义的是不带类型的常数,只进行简单的字符替换。在预编译的时候起作用,不存在类型检查。

其实很多时候我们错误的以为常量就是const 修饰的变量,这个说法其实是有瑕疵的。

指针常量

很多网友在学习指针和指针的特性等问题上总是会绕进去,其实不要绕进去最重要的一点是 要把握住核心本质。

本质上是一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化

int num = 5;
int *const p = #  // p为一个常量,拥有常量的属性。
*p = 70;
int snum = 100;
int *sp = &snum;
p = sp;

聪明的你一定看出上面代码有个地方会报错,是的 p 被我们声明为一个指针常量,此时指针p具有了常量的属性,其不能在改变指向,但是其指向的值是可以改变的。所以报错的代码是p = sp这句。

常量指针

常量指针本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。在常量指针中,指针指向的内容是不可改变的,指针看起来好像指向了一个常量。

int num = 5;
int const *p = #   //常量指针
const int *sp = #  //常量指针
*p = 20;
int snum = 100;
p = &snum;   //改变指向
sp = &snum;

是不是又发现上面的代码有一处报错,你太聪明了,基本搞懂了常量和指针的本质。指针p和sp只是申明格式不同,本质完全一样。p被声明为一个指针,指向一个常量。换句话说就是一个常量的地址存放在指针p中。此时报错的就是*p = 20,因为常量是不可变的。

到这里你基本掌握了常量和指针的关系,其实还是很简单的,也没大家在学校学的那么绕。接下来给大家在介绍一个进阶的关系。

常量指针常量

本质上是一个常量,该常量被一个常量指针指向。也就是说一个常量指针里面放置一个常量的地址,千万不要多看一眼这句话,你会被绕进去。

const int num = 5;   //一个不可变的常量
const int * const p = #  //一个存放常量地址的常量指针

千万不要绕进去了,其实认真理解了上面的指针常量和常量指针的问题,这个问题看起来会简单很多,就是一个常量,和一个常量指针。num是一个不可改变的常量,p只一个指针,该指针也是不可改变指向的。

指针和常量这个问题在面试中会被问到,好好理解下,同时有助于你更好的理解指针。

指针和函数
函数指针
什么是函数指针

如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。

函数指针的定义和普通指针不太一样。函数返回值类型 (* 指针变量名) (函数参数列表);

bool(*p)(char, int); 

还是很简单的,这就知道怎么定义一个函数指针变量了,当然也有很复杂的函数指针变量,面试的时候面试官可能会问一些变态的面试题,比如:

int (*(void (*)())0)();
void (*signal(int , void(*)(int)))(int

不过还是那句话,要把握核心本质,函数指针的核心本质是:函数返回值类型 (* 指针变量名) (函数参数列表);

函数指针使用

很多人会说,搞这么难干嘛,平时有使用么?哈哈,还真的经常用到,尤其是标准库中用的那叫一个多,比如sort中的比较函数就是一个函数指针。

指针作为函数参数

用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。

这不得不使我想起一个经典案例,大学老师一定会讲的,而且当时也是很多同学一直半解的。

void swap(int a,int b){
  int tmp = a;
  a = b;
  b = tmp;
}
int main(){
  int x = 10;
  int x = 20;
  printf("swap before:%d,%d",x,y);
  swap(a,b);
  printf("swap after:%d,%d",x,y);
  return 0;
}

看完上述内容,你们对c语言中的指针有进一步的了解吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读。

相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...