区别:
作用:可以通过指针变量访问其指向变量的数据。
介绍:如下图 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 }
引用传递是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]++;