最近因为项目在写c代码,发现指针基础知识都已经开始忘了,仅此留下笔记以便以后复习。
指针变量的声明和初始化
指针变量把内存地址作为它们的值。通常,变量包含特定的值。但是,指针包含的是包含特定值的变量的内存地址,即:变量名直接引用数值,而指针间接引用数值,如下图所示。注意:在图中,通常把指针表示为一个变量指向另一个变量的箭头,前者包含一个地址值,后者则是在内存中位于该地址的变量。
和其他变量一样,指针在使用前必须被声明。上图中的指针声明如下:
int *countPtr, count;
声明了countPtr是int*类型的(即一个指向int值的指针),读作“countPtr是一个指向int的指针”,或“countPtr指向一个 int类型的对象”。注意:count是一个int类型的变量,但不是指向int的指针。
指针可以在声明时或在赋值语句中初始化。指针可以被初始化为0,NULL或地址。值为0或NULL的指针不能指向任何对象,称为空指针。只有整数0可以直接赋值给一个指针变量,而其他整数要先强制转换成一个指针类型。
指针运算符
- 指针运算符&是一个一元运算符,返回操作数的内存地址。
(注意: 一级指针指向的内容一定是一个“地址”,而不是普通变量。我们在使用的时候,对一级指针赋值,一定要给一个 地址,而不是变量)例如:
int y=5;
int *yPtr;
yPtr = &y; //变量y的地址赋值给指针变量yPtr;变量yPtr“指向”y。
下图为一个内存中指针的另外一种示意图,其中假设整数变量y存储在内存地址600000,指针变量yPtr存储在内存地址500000.
- *运算符通常称为间接运算符或间接引用运算符,它返回其指针操作数所指向的对象的同义词(即别名或昵称)。
例如(参见图8.2):
cout << *yPtr << endl; //打印变量y的值,5,等价于:cout<<y<<endl;
间接引用的指针也可以在赋值语句的左边使用。
*yPtr=9;//表示把9赋值给图8.3中的y
使用间接引用指针来接收输入的值:
cin >> *yPtr;//表示把输入的值存放到y中
下面实例:
#include <iostream>
using namespace std;
int main(){
int a;
int *aPtr;
a=7;
aPtr=&a;
cout<<"a的地址是:"<<&a //0012F580
<<"\naPtr的值是:"<<aPtr<<endl; 0012F580
cout<<"a的值是:"<<a //7
<<"\n *aPtr的值是:"<<*aPtr<<endl;//7
cout<<"*和&是互为相反的"<<endl;
cout<<"&*aPtr = "<<&*aPtr<<endl; //&*aPtr0012F580
cout<<"*&aPtr = "<<*&aPtr<<endl; //*&aPtr0012F580
}
注意:
(1)在第一次定义时: *不是引用的功能。
(2) 其他任何情况下,* 都是表示引用的功能,即:通过 * 告诉编译器,程序要取这个指针所指向的地址里的内容(也就是间接引用:先根据指针的值,这个指针的值,不是普通变量值,而是一个 地址,然后再通过这个地址,获取对应的值)。