介绍C语言指针

2018-06-18 03:50:28来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

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

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:STM32F4系列单片机上使用CUBE配置MBEDTLS实现pem格式公钥导入

下一篇:C语言之函数