首页 > 编程知识 正文

c语言什么是指针,c语言指针变量

时间:2023-05-05 08:27:13 阅读:107552 作者:2132

指针变量是什么? 它的作用是什么呢? 我相信很多学习c语言的同学对此有很多疑问。 下一课,我们将详细介绍C语言的指针变量,消除疑问。

指针变量是指存储地址的变量,是测定根据地址的变更而指定的性质的变换方法。 更确切地说,数据在内存中的地址也称为指针,如果变量包含指向数据的指针,则称为指针变量。 在c语言中,可以用称为指针变量的变量存储指针。 指针变量的值是某个数据的地址。 这些数据可以是数组、字符串、函数或另一个常规变量或指针变量。 其中,存储' k '字符并占用地址0X11A内存的char类型变量c (假设c(ascii代码为十进制75 )地址通常用十六进制表示。 还有一个指针变量p。 其值为0X11A,正好等于变量c的地址。 在这种情况下,我们将p称为指向c的指针,或者p称为指向变量c的指针。 具体如图1所示。

图1

定义指针变量

请注意,指针变量的定义与常规变量的定义类似,但在变量名称前加星号*。 具体形式如下

datatype *name

或者

datatype *name=value;

*表示这是指针变量,而data type表示指针变量指向的数据类型。 例如:

int *p1;

在此,p1是指向int型数据的指针变量,但关于p1指向哪个数据,实际上应该由给定的值来决定。 另外,例如:

int a=100;

int *p_a=a;

如果在定义指针变量p_a的同时进行初始化,并赋予变量a的地址,则p_a将指向a。 值得注意的是,p_a所需的地址必须在a之前加上地址符号。 不那样做的话就错了。 和普通变量一样,指针变量也可以多次写入。 只要我们想,就可以随时改变指针变量的值。 请看以下代码。

//定义普通变量

float a=99.5,b=1 0.6;

char c='@ ',d='# ';

//定义指针变量

float *p1=a;

char *p2=c;

//更改指针变量的值

p1=b;

p2=d;

在上面的代码中,*是一个特殊的符号,表示一个变量是指针变量,定义p1、p2时必须有*。 另一方面,给p1,p2赋值时,因为已经知道是指针变量,所以不需要额外加*,以后可以和普通变量一样使用指针变量。 这意味着定义指针变量时必须具有*,而为指针变量赋值时不能具有*。 以下,假设变量a、b、c、d的地址分别为0X1000、0X1004、0X2000、0X2004。 图2比较全面地反映了p1、p2指向的变化。

图2

这里笔者必须强调的是,p1、p2的类型分别是float*和char*,而不是float和char。 因为它们是完全不同的数据类型,所以必须注意。

也可以按如下方式连续定义指针变量:

int *a、*b、*c; //a、b和c的类型均为int *

请注意,每个变量前面都有*。 写如下,只有a是指针变量,b、c都是类型为int的普通变量。

int *a、b、c;

通过指针变量获取数据

指针变量存储数据的地址,可以从指针变量获取该地址上的数据。 具体形式如下

*指针;

此处的*称为指针运算符,用于获取某个地址的数据。 请看下面的代码示例。

#包含

int main ()。

int a=15;

int *p=a;

printf('%d,%dn ),a,*p ); //哪种方式都可以输出a的值

返回0;

}

执行结果:

十五、十五

其中,如果a的地址为0X1000,p指向a,则p自身的值也为0X1000。 *p表示获取地址0X1000上的数据,即变量a的值。 从输出结果来看,*p和a是等价的。 CPU要读写数据,必须知道内存中数据的地址。 普通变量和指针变量是地址的助记符。 *p和a获取的数据相同,但执行过程略有不同。 a可以通过一次运算获取数据,而*p经过两次运算。 将变量a、p的地址分别设为0 x 1000,0x f0a 0,将它们的指向关系如图3所示。

图3

程序编译并链接后,a、p将被替换为相应的地址。 *使用p时,从地址0XF0A0获取变量p自身的值。 此值是变量a的地址,然后从该值获取变量a的数据。 有前后两次运算。 另一方面,使用a可以直接从地址0X1000获取其数据,只需要进一步的运算。 也就是说,使用指针是间接获取数据,使用变量名是直接获取数据,前者比后者成本更高

要高。指针除了可以获取内存上的数据,也可以修改内存上的数据,比如:

#include

int main(){

int a = 15, b = 99, c = 222;

int *p = &a; //定义指针变量

*p=b; //通过指针变量修改内存上的数据

c= *p; //通过指针变量获取内存上的数据

printf("%d,%d,%d,%dn",a,b,c,*p);

return 0;

}

运行结果:

99,99,99,99

*p代表的是a中的数据,它等价于a,可以将另外的一份数据赋值给它,也可以将它赋值给另外的一个变量。*在不同的场景下有不同的作用:*可以用在指针变量的定义中,表明这是一个指针变量,以和普通变量区分开;使用指针变量时在前面加*表示获取指针指向的数据,或者说表示的是指针指向的数据本身。也就是说定义指针变量时的*和使用指针变量时的*意义完全不同。笔者以下面的代码例子为例:

int *p=&a;

*p=100;

第1行代码中*用来指明p是一个指针变量,第2行代码中*用来获取指针指向的数据。此时我们需要注意的地方是,给指针变量本身赋值时不能加*。接下来我们修改上面的语句:

int *p;

p = &a;

*p=100;

第2行代码中的p前面就不能加*。另外指针变量也可以出现在普通变量能出现的任何表达式中,比如:

int x,y, *px=&x, *py=&y;

y= *px+5; //表示把x的内容加5并赋给y, *px+5相当于(*px)+5

y= ++*px; //px的内容加上1之后赋给y, ++*px相当于++(*px)

y= *px++; //相当于y=(*px)++

py=px;//把一个指针的值赋给另一个指针

具体例子:通过指针交换两个变量的值。

#include

int main(){

int a = 100, b = 999, temp;

int *pa = &a, *pb = &b;

printf("a=%d,b=%dn",a,b);

/*****开始交换*****/

temp= *pa; //将a的值先保存起来

*pa= *pb; //将b的值交给a

*pb= temp; //再将保存起来的a的值交给b

/*****结束交换*****/

printf("a=%d,b=%dn",a,b);

return 0;

}

运行结果:

a=100,b=999

a=999,b=100

从上面的运行结果我们可以观察到,a、b的值已经发生了交换。此时需要我们注意的地方是临时变量temp,它的作用特别重要,因为执行*pa=*pb;语句后a的值会被b的值覆盖,如果不先将a的值保存起来以后就找不到了。

◎关于*和&的谜题

假设有一个int类型的变量a,pa是指向它的指针,那么*&a和&*pa分别是代表什么意思呢?

*&a可以理解为*(&a),&a表示取变量a的地址(等价于pa),*(&a)表示取这个地址上的数据(等价于*pa),绕来绕去,又回到了原点,*&a仍然等价于a。

&*pa可以理解为&(*pa),*pa表示取得pa指向的数据(等价于a),&(*pa)表示数据的地址(等价于&a),所以&*pa等价于pa。

◎对星号*的总结

在我们目前所学到的语法中,星号*主要有三种用途:

①表示乘法,比如int a = 3, b = 5, c; c=a*b;,这是最容易理解的。

②表示定义一个指针变量,以和普通变量区分开,比如int a=100;int *p=&a;。

③表示获取指针指向的数据,是一种间接操作,比如int a,b, *p=&a; *p=100; b=*p;。

本次C语言基础之指针变量的讲解到此暂告一段落,如果以后有内容的补充和修改的话,笔者会继续在此补充和修改,同时也欢迎大家对本次的讲解提出建议和补充。最后希望本次的讲解对大家学习C语言能起到一定的帮助作用!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。