前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >介绍C语言指针

介绍C语言指针

作者头像
_春华秋实
发布2018-08-17 13:15:40
2.2K0
发布2018-08-17 13:15:40
举报
文章被收录于专栏:_春华秋实_春华秋实

C语言的指针

代码语言:javascript
复制
区别:
  • 指针变量存放的是某一类型变量的地址。
  • 普通变量存储的是某一类型数据。

作用:可以通过指针变量访问其指向变量的数据。

介绍:如下图 1 可以得到这样的结论,指针变量和普通变量基本相同。

代码语言:javascript
复制
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main(){
4     char *p;
5     char a = 'H';
6     p = &a;
7     return 0;
8 }
  • 每个指针都对应着一个数据类型。
  • 指针存储着指向类型对象的地址。
  • 通过&运算符可以获得变量的地址,赋值给该类型的指针变量。
  • * 操作符用于访问指针地址指向的内容。
  • 指针和数组联系紧密 a[3] 类似于 *(a+3)。

C语言支持引用传递?

引用传递是C++才有的特性,C语言只支持值传递。所以C语言只能通过传指针来达到在函数内修改函数外变量的功能。也就是swap(int &a,int &b)在C语言中是错的,swap(int *a,int *b)是对的。

值传递

指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

引用传递

调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。

部分指针悬挂情况

指针指向非法的内存地址,那么这个指针就是悬挂指针,也叫野指针

初始化不正确

代码语言:javascript
复制
 //把352赋值给p3,一是类型不匹配,再者如果真的赋值成功(用强制转换)那么p3指向的地址是352,这个地址不一定是可用的。
int* p = 352;   
 
//这段代码编译没错,向p3指向的地址中放入352这个数,但是p3的值没有初始化,它指向的地址不确定,所以p3现在是野指针,运行时也可能程序崩溃。  
int *p;
*p = 352;  

函数返回局部变量

代码语言:javascript
复制
1 //指针指向某个对象之后,当这个对象的生命周期已经结束,对象已经消亡后,仍使用指针访问该对象,将出现运行时错误。
2 int* retAddr(){
3     int num=10;
4     return &num;
5 }

多次清空,访问清空数据等

代码语言:javascript
复制
//多次清空
x = malloc(N * sizeof(int));
free(x);
y = malloc(M * sizeof(int));
free(x);

//非法访问
x = malloc(N * sizeof(int));
free(x);
y = malloc(M * sizeof(int));
for (i = 0; i < M; i++)
    y[i] = x[i]++;

C++中引用传递与指针传递区别(进一步整理)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-03-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C语言的指针
  • C语言支持引用传递?
    • 值传递
      • 引用传递
      • 部分指针悬挂情况
        • 初始化不正确
          • 函数返回局部变量
            • 多次清空,访问清空数据等
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档