介绍C语言指针
程序员文章站
2022-05-18 18:17:44
C语言的指针 指针变量存放的是某一类型变量的地址。 普通变量存储的是某一类型数据。 作用:可以通过指针变量访问其指向变量的数据。 介绍:如下图 1 可以得到这样的结论,指针变量和普通变量基本相同。 1 #include 2 #include 3 int ma ......
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 # 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]++;