指针变量 地址如何间接访问另一个变量呢?

博客访问: 82719
博文数量: 53
博客积分: 2200
博客等级: 大尉
技术积分: 570
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
/*=============================================================&&& 熟悉指针变量的定义和使用,区别&和*符号的区别,&代表取地址运算符&&& *代表指针运算符(或称间接访问运算) ==============================================================&&&&&&&&&&&& 作者:最后的村长&&&&&&&&&&&& 时间:日&&&&&&&&&&&& 工具:DEV C++ 4.9.9.2&&&&&&&&&&&& version:1.0==============================================================*/#include #include /*=============================================================*/int main(){&&& int a,b;&&& int *pointer_1,*pointer_2;//定义指针变量 &&& a=8;b=9;&&& pointer_1=&a;//将a的首地址赋给指针变量pointer_1 && pointer_2=&b;//将b的首地址赋给指针变量pointer_2& &&& printf("a=%d,b=%d\n",a,b);&&& printf("a=%d,b=%d\n",*pointer_1,*pointer_2);//*间接访问变量 &&& printf("变量a存放的地址是:%d,存放的字节数是:%d,变量b存放的地址是:%d\n",pointer_1,sizeof(a),pointer_2);&&& printf("a=%d,b=%d\n",*&a,*&b);//*间接访问变量 &&& printf("a=%d,b=%d\n",*&(*pointer_1),*&(*pointer_2));//*间接访问变量 &&& system("PAUSE");&&& return 0;}
阅读(305) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。指针_Rainbow_1112_新浪博客
指针是C语言中的一个重要概念,也是C语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构;能动态分配内存;方便地使用字符串;有效而方便地使用数组;在调用函数时能获得1个以上的结果;能直接处理内存单元地址等。
1.地址和指针的概念
如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。编译系统根据程序中定义的变量类型,分配一定长度的空间。内存区的每一个字节有一个编号,这就是“地址”。在地址所标识的内存单元中存放数据。在程序中一般是通过变量名来对内存单元进行存区操作的。其实程序经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。变量地址存取变量值的方式分为直接访问和间接访问。直接访问是直接使用变量的地址,而间接访问时将变量的i的地址存放在另一个变量中。按C语言规定,可以在程序中定义整型变量、实型变量、字符变量等,也可以定义这样一种特殊的变量,它是存放地址的。C语言中,将地址形象化地称为“指针”,意思是通过它能找到以它为地址的内存单元。一个变量的地址称为该变量的“指针”。如果有一个变量专门用来存放另一个变量的地址(即指针),称它为“指针变量”,指针变量就是地址变量(存放地址的变量)。指针变量的值(即指针变量中存放的值)是地址(即指针)。
2.变量的指针和指向变量的指针变量
C语言规定所有变量在使用前必须定义,指定其类型,并按此分配内存单元。指针变量不同于数值的变量,它是专门用来存放地址的,必须将它定义为“指针类型”。定义指针变量的一般形式为:基类型
*指针变量名;例如:float *pointer_3;
在定义指针变量时要注意两点:
(1)指针变量前面的“*”表示该变量的类型为指针型变量。
(2)在定义指针变量时必须指定基类型。
对指针变量赋值时需要注意:
(1)指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变量。
(2)赋给指针变量的变量地址不能是任意的类型,而只能是与指针变量的基类型具有相同类型的变量的地址。
3.引用指针变量
在引用指针变量时,可能有三种情况:
(1)给指针变量赋值。如:p=&a;则指针变量p的值为变量a的地址。
(2)引用指针指针变量的值。如:printf("%o",p);作用是以八进制形式输出指针变量p的值,如果p指向了a,就是输出了a的地址。
(3)引用指针变量指向的变量。如果已执行“p=&a;”,即指针变量p指向了整型变量a,则printf("%d",*p);其作用是以十进制形式输出指针变量p所指向的变量的值,即变量a的值。
要熟练掌握两个有关的运算符的使用:
(1)& 取地址运算符。&a是变量a的地址。
(2)* 指针运算符(或称为“间接访问”运算符),*p是指针变量p指向的对象的值。
示例:通过指针变量访问整型变量。程序代码如下:
1.#include
2.void main()
4.&int a,b;
5.&int *p1,*p2;
6.&a=100;b=10;
7.&p1=&a;p2=&b;
8.&printf("a=%d,b=%d\n",a,b);
9.&printf("*p1=%d,*p2=%d\n",*p1,*p2);
程序结果如下:​
4.指针变量作为函数参数
函数的参数不仅可以是整型、浮点型、字符型数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。
示例:输入的两个整数按大小顺序输出。程序代码如下:
1.#include
2.void main()
4.&void swap(int *p1,int *p2);
5.&int a,b;
6.&int *p1,*p2;
7.&a=100;b=10;
8.&scanf("%d,%d",&a,&b);
9.&p1=&a;p2=&b;
11.&&swap(p1,p2);
13.&printf("max=%d,min=%d\n",a,b);
15.void swap(int *p1,int *p2)
18.&temp=*p1;
19.&*p1=*p2;
程序代码结果如下:​
C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。用指针变量作函数参数时同样要遵循这一规则。不可能通过执行调用函数来改变指针变量的值,但是可以改变实参指针变量所值变量的值。
Rainbow_1112
博客等级:
博客积分:0
博客访问:467
关注人气:0
荣誉徽章:指针知识总结
指针知识总结
C++经典语法
指针知识总结
&定义:指针用来保存、操作内存,解决系统堆栈空间的溢出问题,可更为灵活的使用内存。
#地址是变量在内存中的编号,可用取地址符“&”来获得变量的地址。
#指针可以保存地址。
#野指针:每个指针必须有对应的一个变量地址,若没有就是一个野指针,其带有损害。
#空指针:解决办法是将指针初始化为零。
#指针只能存储、操作、运算与它类型相同的变量的地址。
#用指针访问变量值:*p&=&i;
&指针通过间接运算符“*”+指针变量“p”来访问变量i的值。
&&&&&&&&&&&&&&&&&int&&a=1;
&&&&&&&&&&&&&&&&&int&&*p;
&&&&&&&&&&&&&&&&&p&=&&a;
&&&&&&&&&&&&&&&&&Cout&&*p;
#区分指针的地址、指针保存的地址和该地址的值。
#指针对数值的操作:间接访问该值(即读取该地址的数据),就可修改该数据(重新赋值)。
#更换指针保存的地址:改变指针的指向
&&&&&*将一个变量的赋给另一个变量
&&&&&&&&&&&&&&&&&&&&&int&&i&=0;
&&&&&&&&&&&&&&&&&&&&&int&&j&=1;
&&&&&&&&&&&&&&&&&&&&&i&=&j;
&&&&&*可以将另一个变量的地址赋给已经保存了某个变量的地址的指针变量,如:
&&&&&&&&&&&&&&&&&&&&&int&&i&=10;
&&&&&&&&&&&&&&&&&&&&&int&&j&=20;
&&&&&&&&&&&&&&&&&&&&&int&&*p=&i;
&&&&&&&&&&&&&&&&&&&&&P=&j;
#为什么用指针?
指针的三大用途:
①.处理堆中存放的大型数据
②.快速访问类的成员数据和函数
②.以别名的方式向函数传递参数
二.栈和堆
一般来说,写程序就是与数据打交道,在执行程序某一功能的时候,将该功能所需要的数据加载到内存中,然后在执行完毕的时候释放掉该内存。
#栈区——由编译器自动分配并释放,该区域一般存放函数的参数值,局部变量的值等。
#堆区——一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收。
#寄存器区——用来保存栈顶指针和指令指针。
#全局区(静态区)——全局变量和静态变量的存储是放在一块,程序结束后由系统自动释放。
#文字常量区——常量字符串就是放在这里的,程序结束后由系统自动释放。
#程序代码区——存放函数体的二进制码。
#堆和栈的不同:
1.内存申请方式上的不同
2.系统响应的不同
3.空间大小的不同
4.执行效率的不同
&&&&&⑴.栈&栈由系统自动分配,因此速度较快。但程序员不能对其进行操作。
&&&&&⑵.堆&堆是由程序员分配内存,速度一般比较慢,而且容易产生内存碎片,不过用起来很方便。
5.执行函数时的不同
#用指针创建堆中空间
&&&&&&&&&&&&&&&&&&&&&&int&&&*p;
&&&&&&&&&&&&&&&&&&&&&&P&=&new&
&&&&&&&&&&&&&&&&&&&&&&int&&&*p&=&new&
#用指针删除堆中空间
&当程序结束作为局部变量的指针自动消失后,计算机就再也找不到用new创建的内存了,就像丢失了这块内存一样,这种情况就是“内存泄露”。
因此如果不需要一块内存空间,那么就必须对其指针使用关键字delete。如:
&&&&&&&&&&&&&&&&&&&&&&int&&&*p&=&new&
&&&&&&&&&&&&&&&&&&&&&&delete&&p;
这样释放指针所指向的内存,而不会释放指针。
&&&int&&&*p&=&new&&&//新建一块内存区域,用p指向它
&&&delete&&p;&&&&&&&&&//删除指针指向的内存区域
&&&p&=&0;&&&&&&&&&&&&&//置空指针
&&&delete&p;&&&&&&&&&&//再次删除该指针就没有危险
三.动态内存
#内存泄露:
&&&&&&&&&&&&&&&&&&&&&&int&&*p&=&new&
&&&&&&&&&&&&&&&&&&&&&&p&=&new&
假如没有删除一个指针就对其重新赋值,就会造成内存泄露。
正确方法一:&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&int&&*p&=&new&
&&&&&&&&&&&&&&&&&&&&&&delete&&p;
&&&&&&&&&&&&&&&&&&&&&&p&=&new&
方法二:不删除第一块内存空间,重新创建另开辟一块。
&&&&&&&&&&&&&&&&&&&&&&int&&*p1&=&new&
&&&&&&&&&&&&&&&&&&&&&&int&&*p2&=&new&
&&&&&&&&&&&&&&&&&&&&&&
#在堆中创建对象
&&&&&&&&&&&&&&&&&&&&&&Human&&*p;
&&&&&&&&&&&&&&&&&&&&&&P&=&new&H
&&&&&&&&&&&&&&&&&&&&&&Human&&*p&=&new&H
#在堆中删除对象
&&&&&&&&&&&&&&&&&&&&&&Human&&*p&=&new&H
&&&&&&&&&&&&&&&&&&&&&&delete&&p;
#访问堆中的数据成员
&如果访问对象的数据成员和函数,则使用&成员运算符“.”&。&如:
&&a.get(&);
&如果是在堆中创建的数据成员和函数,而该对象的内存地址保存在指针变量p中,如:
&&(*p).get(&);
&使用括号是为了保证先使用*号读取p的内存地址,然后再使用成员运算符来访问成员函数get()。
但是这比较麻烦,故而在C++里专有一个&成员指针运算符&“---&”,表示用指针来间接访问对象的成员。如:
&&p&-&get(&);
#在构造函数中开辟内存空间
&A::A{&i&=&new&int(999);}
&A::A{&delete&&i;}
对象对自己成员的专属标识。this变量记录每个对象的内存地址,然后通过间接访问运算符
-&访问该对象的成员。this&-&&i;
四.指针的运算
1.指针的自加减运算
&&&&&int&&*p&=&new&
&&&&&p++;
&&&&&p-&-;
&&&&&p=p-2;
2.指针的赋值运算
&&&&&int&&*p&=&new&
&&&&&int&&*p1&=&new&
&&&&&p=p1;
3.指针的相减运算(两块内存的地址差)
&&&&&int&&*p&=&new&
&&&&&int&&*p1&=&new&
&&&&&p=p1;
4.指针的比较运算
&&&&&int&&*p&=&new&
&&&&&int&&*p1&=&new&
&&&&&if&(p=p1)&&//加入条件判断语句
五.指针与常量
将指针声明为常量指针,即指针不可变。如:
&&&&&&&&&&&&&&&&&&&&&&&&int&&*const&&p;
&但是它指向的整数是可以改变的。
#指向常量的指针
&定义一个指向常量的指针,如:
&&&&&&&&&&&&&&&&&&&&&&&&const&&int&*p;
该指针所指向的整数是不可修改的,但是该指针可被修改。
#指向常量的长指针
定义一个指向常量的常指针,如:
&&&&&&&&&&&&&&&&&&&&&&&&const&&int&*const&&p;
那么该指针指向的整数是不可修改的,并且该指针也不可以被修改。
(声明:本文章是笔者学习范磊老师《C++全方位学习》中指针一章的学习提要,手动码字。)
我的热门文章
即使是一小步也想与你分享p1指向某个整型变量,要使指针p2也指向同一变量,哪一个语句是正确的 。 A. p2=*&p1; B. p2=**p1; C. p2=&_百度知道问一个关于C语言指针的问题,我的理解是,指针是为了通过变量的内存地址间接访问变量..但是既然可以直接..既然可以直接访问变量,为何要用上指针来间接访问变量呢.指针的优势是什么,我们为什么要用指针呢.非常感谢你能替我解忧
小腾wan1114
可以提高程序的编译效率和执行速度,使程序更加简洁.通过指针被调用函数可以向调用函数处返回除正常的返回值之外的其他数据,从而实现两者间的双向通信.利用指针可以实现动态内存分配.指针还用于表示和实现各种复杂的...
可能这是新手的疑问吧..因为我觉得直接访问,总会比间接访问的执行速度更快才对.
谢谢你的解疑..
为您推荐:
其他类似问题
扫描下载二维码

我要回帖

更多关于 指针变量 地址 的文章

 

随机推荐