int iMyAge;
int* pMyAge; //定义一个指针变量,一个指向一个变量的地址的变量;
一个专门用来存放另一个变量的地址的变量;
表示这是一个指针变量,int表示指针变量所指向的变量的数据类型;
*称为指针运算符;(从右到右的运算顺序);
只能赋地址,不能赋其他数据,基一般格式是:
& 变量名;
pMyAge = &iMyAge; //指针初始化,
可以定义时同时赋值或先定义后赋值;
& 称为取址运算符(从右到右的运算顺序);
在C++语言中,将数组名称赋予指针变量时不需要写"&",但是在将数组首地址赋予指针变量时须加上"&";
//引用指针变量是对变量进行间接访问的一种方式。引用指针变量的格式如下:
//* 指针变量
动态内存分配
int *pData = new int; //定义一个整型指针,使用new运算符在堆中开辟空间;
*pData = 100; //为指针在堆中的数据赋值;
... //使用pData进行其他操作
delete pData; //释放pData在堆中占用的空间
名称 | pMyAge | iMyAge | |
数据: | 0x0012FF7C | 0x1E | |
地址: | 0x0012FF78 | 0x0012FF7C |
名称 | pMyAge | iMyAge | |
*pMyAge | |||
数据: | &iMyAge | → | 30 |
在低级语言的汇编语言中都是直接通过地址来访问内存单元的,而在高级语言中则 是使用变量名访问内存单元,但是作为高级语言的C++却提供了通过地址来访问内在单元的方法。
间接访问-指针
指针是内在的一个地址,地址是用抽象的,所以可以给一个通俗的名字给它,就是指针变量。
1 可以增加变量访问的途径,使变量不仅可以通过变量名直接访问,也可以通过指针间接访问。
2 指针可以使程序的不同部分共享数据。
3 可以通过指针在程序执行过程中动态申请空间。
程序运行时每个变量都会有一块内存空间,变量的值就是存入在这块空间中。程序可以通过变量名访问这块空间中的数据。这种访问方式称为直接访问。
内存中中的每字节都有一个编号,每个变量对应的内存的起始编号称为这个变量的地址。程序运行时,计算机记录了每个变量和它地址的对应关系。当程序访问某个变量时,计算机通过这个对应关系找到变量的地址,访问该地址中的数据。
直接访问就如你知道A朋友(变量)家在哪里(地址),你想去他家玩,就可以直接到那个地方去。如果我不知道A朋友家信哪里,但另外有个B朋友知道,你可以从B朋友处得到A朋友家的地址,再按地址去A朋友家。这种方式称为间接访问。在C++中,B朋友被称为指针变量,并称为B指针指向A变量;
定义一个指针变量要说明三个问题:
1 该变量的名字是什么?
2 该变量中存储的是一个地址(即是一个指针);
3 该地址中存储的是什么类型的数据;
指针:内存的快捷方式;
指针是内存地址,使用指针访问变量,就是直接对内存中的数据进行操作,合理地使用指针,可以提高程序运行的速度,增强操作的灵活性。
访问内存中的数据有两种方式,直接访问和间接访问。直接访问就是通过变量来实现,因为变量是内存中某一块存储区域的名称;间接访问就是通过指针来实现。指针并不是用来存储数据的,而是用来存储数据在内存中的地址,我们可以通过访问指针达到访问内在中数据的目的。
指针的声明:指针类型* 名称,如:
int* ptr; //指针的类型是int*;
通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当作什么来看。
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的值都是一个32位整数,因为32位程序里内存地址全都是32位的。
当我们说一个指针的值是xx时,就相当于说该指针指向了以xx为首地址的一片内存区域;我们说一个地址指向了某块内存区域,就相当于说该指针的值是这块内在区域的首地址。
根据数组占据内存中连续的存储区域这样一个性质,使用指针将使我们操作数组元素的手段更加丰富。
C语言中许多字符串的操作都是由指向字符数组的指针及指针的运算来实现。对字符串来说一般都是严格顺序存取,使用指针可以打破这种存取方式,使字符串的处理更加灵活;
指针是一个其数值为地址的变量。
nurse = 22;
ptr = &nurse;
val = *ptr
以上三行等价于:
val = 22;
有关指针的数据类型 | |
定义 | 含义 |
int i; | 定义整型变量i |
int *p; | p为指向整型数据的指针变量 |
int a[n]; | 定义整型数组a,它有n个元素 |
int *p[n]; | 定义指针数组p,它由n个指向整型数据的指针元素组成 |
int (*p)[n]; | p为指向含n个元素的一维数组的指针变量 |
int f(); | f为带回整型函数值的函数 |
int *p(); | p为带回一个指针的函数,该指针指向整型数据 |
int (*p)(); | p为指向函数的指针,该函数返回一个整型值 |
int **p; | p是一个指针变量,它指向一个指向整型数据的指针变量 |
指针=基本数据类型+存储地址
指针是指存储XX数据类型的地址,也就是访问到一个地址后,需要截取多长的数据呢?由类型定义,即可知长度;
指针类型数据,能用来实现各种复杂结构(如链表、树、栈等)的运算;
int a,b;
int *pointer_1,*pointer_2;
a=100,b=10;
pointer_1=&a;
pointer_2=&b;
printf("%d,%d\n",a,b);
printf("%d,%d\n",pointer_1,pointer_2);
(2) 指针变量赋值
将一个变量地址赋给一个指针变量。如:
p=&a; (将变量a的地址赋给p)
p=array; (将数组array首元素地址赋给p)
p=&array[i];(将数组array第i个元素
的地址赋给p)
p=max;(max为已定义的函数,将max的入口
地址赋给p)
p1=p2;(p1和p2都是指针变量,将p2的
值赋给p1)
内存区的每一个字节有一个编号,这就是“地址” 。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。
1.按变量地址存取变量值的方式称为“直接访问”方式
2. 另一种存取变量值的方式称为“间接访问”的方式。即,将变量i的地址存放在另一个变量中。
在C语言中,指针是一种特殊的变量,它是存放地址的。
一个变量的地址称为该变量的“指针”。
例如,地址2000是变量i的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。上述的i_pointer就是一个指针变量。
(1)指针变量前面的“*”,表示该变量的类型为指针型变量。
例: float *pointer_1;
指针变量名是pointer_1 ,而不是* pointer_1 。
(2) 在定义指针变量时必须指定基类型。
需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。下面的赋值是错误的∶
用指针变量可以指向一个函数。
函数在编译时被分配给一个入口地址。这个函数的入口地址就称为函数的指针。
函数指针变量常用的用途之一是把指针作为参数传递到其他函数。指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。
一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。
(2) 指针变量赋值
将一个变量地址赋给一个指针变量。如:
p=&a; (将变量a的地址赋给p)
p=array; (将数组array首元素地址赋给p)
p=&array[i];(将数组array第i个元素的地址赋给p)
p=max;(max为已定义的函数,将max的入口地址赋给p)
p1=p2;(p1和p2都是指针变量,将p2的值赋给p1)
指针就是指向变量和对象的地址。如果对象的数据量过大,只需用指针来作形差,然后传递一个地址即可,从而大大提高了效率。
指针并不是用来存储数据的,而是用来存储数据在内存中的地址,它是内存数据的快捷方式,通过这个快捷方式,即使不知道这个数据的变量名,也可以操作它。
变量赋值可以修改内存,在引入了指针之后,可以使用另外一种办法来修改内存值:星号操作。可以使用星号操作符*作用于指针变量上,来直接读取内存的值,如:
int a = 0 ;
int* p = &a; //p指向a;
*p = 0xa0a0a0a0; //写操作:修改p指向的内存的值;
int b = *p //读操作,读取p指向的内存的值;
星号操作是一种按地址访问的技术,只要知道了这块内存的地址,就可以直接修改这块内存的值。
内存操作分为两灰:读操作,写操作,当*p作为左值出现被赋值时,就是写操作,*p作为右值时,就是读操作。