首页 > 编程知识 正文

详解C 中指针取地址,c语音中指针与地址

时间:2023-05-04 22:13:51 阅读:191016 作者:4815

对于c语言中指针的操作符有两个:&和*。对于&,就是“取地址”的意思。但对于*,翻译为“解引用”,字面意思不好理解,即使看了后面内容才知道不过是“取指针指向的地址的内容”,"*"的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,“解”就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为“解引用”。也就是说,解引用是返回内存地址中保存的值。

比如int a=10; int *p=&a;   cout<<*p<<endl; 输出a的值,就是解引用操作

 

一、初步了解——指针与取地址

先看程序:

#include<cstdio>int main(void){int num = 7;int *p = &num;printf("%d 的地址是 %pn", num, p);return 0;}

上面int *p定义了一个指向int类型指针p(我们使用*符号把p声明为指针),并初始化p使其指向int类型的变量num,这里&num中的&是取地址操作符,当&作用于一个对象上时,它返回了该对象的地址。

所以这里指针p指向了num所对应的地址。(我测试时输出了0028FF1C)

 

二、如何使用指针?——解引用与指针赋值

#include<cstdio>int main(void){int num = 7;int *p = &num;printf("数值%d所在的地址是 %pn", num, p);printf("指针p所指向的地址为 %p , 该地址上所保存的值为%dn", p, *p);*p = 100;printf("指针p所指向的地址为 %p , 该地址上所保存的值为%dn", p, num);return 0;}

注意这里*操作符为解引用操作符,它返回指针p所指的地址所保存的值。

我们可以对*p赋值,从而改变p所指的地址上说保存的值,从而改变指向此地址的变量num的值。(num的值变为100)

当然,我们也可以给指针p赋值,使其指向另外一个地址:

#include<cstdio>int main(void){int num = 7, another = -5;int *p = &num;p = &another;printf("%dn", *p);//-5return 0;}


三、引用

从某种意义上来说,引用完全有别于上面说介绍的内容:

#include<cstdio>int main(void){int val = 7, val2 = 999;int &refval = val, &refval2 = val2; ///引用必须要初始化,使其绑定到一个变量上///修改引用的值将改变其所绑定的变量的值refval = -12;printf("%d %dn", val, refval);//-12,refval的值和val一样///将引用b赋值给引用a将改变引用a所绑定的变量的值,///引用一但初始化(绑定),将始终绑定到同一个特定对象上,无法绑定到另一个对象上refval = refval2;printf("%d %dn", val, refval);//999return 0;}

 

四、补充

a)指向指针的指针:

#include<cstdio>int main(void){int val = 7;int *p = &val;int **p2 = &p;///**声明一个指向指针的指针printf("val的值为%d %d",*p,**p2);///**p2为两次解引用,可看做*(*p2)return 0;}

由于指针也要占用内存空间存放其值,所以我们也可以定义一个指向指针的指针。

 

b)指针与数组:

指针和迭代器非常像,我们可以说指针就是数组的迭代器:

#include<cstdio>int val[100];int main(void){for (int i = 0; i < 100; ++i)val[i] = i;int *p = val;///等价于int *p = &val[0];///数组的变量名就是一个指针printf("%dn", *p); ///指针p指向val的第一个元素,即val[0]int t = 100;while (t--)///可以直接对指针进行加减运算,就和迭代器一样printf("%dn", *(p++));///输出0~99///指针可以做差:int *p2 = &val[10], *p3 = &val[20];printf("%dn", p3 - p2); //10printf("%dn", p2 - p3); //-10///还可以比比较大小:printf("%dn", p2 < p3 ? p3 - p2 : p2 - p3); //10return 0;}

对于多维数组,只要把指向指针的指针理解好了就行:

#include<cstdio>int val[100][100];int main(void){val[2][1] = 666;///如何用指针取出val[2][1]?printf("%d", *(*(val + 2) + 1));return 0;}

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