介绍C语言指针

C语言的指针

区别:
  • 指针变量存放的是某一类型变量的地址。
  • 普通变量存储的是某一类型数据。

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

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

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)是对的。

值传递

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

引用传递

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

部分指针悬挂情况

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

初始化不正确

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

函数返回局部变量

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

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

//多次清空
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++中引用传递与指针传递区别(进一步整理)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python攻城狮

Python内置函数

mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。

11540
来自专栏Golang语言社区

【Go 语言社区】Go语言学习-接口赋值

在go语言中,接口赋值分为2中情况: 1、将对象实例赋值给接口; 2、将一个接口赋值给另一个接口。 1、将对象实例赋值给接口: 要求对象实现了接口...

32040
来自专栏编程坑太多

js的坑,你遇到过几个

20950
来自专栏老司机的技术博客

golang学习笔记9:函数参数与返回值

Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,比如 Funct...

15420
来自专栏郭耀华‘s Blog

排序算法

冒泡排序法 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大...

29360
来自专栏mwangblog

python变量、语句

16940
来自专栏MasiMaro 的技术博文

结构体和类

在C++中类与结构体并没有太大的区别,只是默认的成员访问权限不同,类默认权限为私有,而结构体为公有,所以在这将它们统一处理,在例子中采用类的方式。

21920
来自专栏Golang语言社区

【Go 语言社区】Go语言类型转换

类型转换是一种可变从一种数据类型转换成另一种数据类型。例如,如果要存储一个long值转成一个简单的整数,那么可以强制类型转换long为int。可以从一种类型使用...

367140
来自专栏coder修行路

go 从入门到精通(二)基本数据类型和操作符

一、文件名&关键字&标识符 所有go源码都是以.go结尾 标识符以字母或下划线开头,大小写敏感 下划线_是特殊标识符,用户忽略结果 保留关键字 导入包时可以设置...

19890
来自专栏编程

python中的变量

变量与数据类型 变量 编程语言中为了能够更好的处理数据,都需要使用一些变量。Python 语言的变量可以是各种不同的数据类型,使用变量的时候不需要声明直接使用就...

22600

扫码关注云+社区

领取腾讯云代金券