变量地址、指针和引用
一、数据变量和内存
当在程序中声明变量时,系统会自动在随机访问存储器(RAM)中为该变量预留出一块空间,其大小根据变量的数据类型决定。下表列出了ISO C++标准所支持的数据类型、所需的存储空间以及数据表示范围。
关键字 所需存储空间(字节) 数据表示范围
|
char 1 -128 ~ 127
|
unsigned char 1 0 ~ 255
|
signed char 1 -128 ~ 127
|
int 4 -2 147 483 648 ~ 2 147 483 647
|
short int 2 -32 768 ~ 32 767
|
unsigned short int 2 0 ~ 65 535
|
unsigned int 4 0 ~ 4 294 967 295
|
long int 4 -2 147 483 648 ~ 2 147 483 647
|
unsigned long int 4 0 ~ 4 294 967 295
|
float 4 6个有效数字,如 0.xxxxxx (在visual C++中是7个有效数字)
|
double 8 10个有效数字,如0.xxxxxxxxxx(在visual C++中是15个有效数字)
|
long double 10 10个有效数字,如0.xxxxxxxxxx(在visual C++中是19个有效数字)
|
二、sizeof运算符
C++提供了一个sizeof运算符,该运算符
返回存储某个数据类型或变量所需的字节数,用法如下:
sizeof variable_name; //处理变量,可以用括号,为了简便通常省去
sizeof (date_type); //处理数据类型,必须带括号
三、计算机内存和十六进制
计算机将数据以“位”的方式进行存储,也就是通常所说的0和1,8位为1个字节。
计算机内存采用十六进制表示法(hexadecimal notation)编址。为了更方便的处理计算机中的位序列,计算机专家采用了十六进制表示法(hex)来按照字节对位序列进行处理。该表示法可以很方便地对位数据进行解释并对计算机内存进行编址。当对指针的值进行输出时,得到的就是一个十六进制数据。通俗的说,就是用
十六进制数据表示数据在内存中的存储地址。
在十六进制表示法中共有16个数字符号:0到9,以及A,B,C,D,E,F。十六进制数据以0x开始。
四、 其地址操作符&
其地址操作符&:返回内存中存储给定变量的十六进制地址。
使用方法:&variable_name
五、指针
指针(pointer) 也是C++中的一种数据类型,它可以存储一个十六进制的地址。指针用来存储程序中变量的地址。当一个指针含有一个变量的地址时,我们就说该指针“指向”这个变量。
指针 存储其他变量十六进制地址的变量。
指针没有像int、float等这样的关键字,但它有自己特殊的声明语句。程序和指针都需要知道所有指向的数据是什么类型的。因此,在声明一个指针时,我们要给出该指针变量所指向的数据类型。
声明指针变量需要使用星号(*),格式如下:
date_type *variable_name;
C++不会自动为指针进行赋值,具体的赋值操作需要自己来完成,可以用取地址操作符&来实现这一操作。
使用指针进行函数的引用调用 将某一变量的地址赋给函数中的一个指针变量。
间接运算符* 当和指针一起使用时,该运算符会把程序指向指针变量所存储的地址处。
下面的例子通过指针来进行函数的调用,将main函数中的变量显示的传给指针。利用间接运算符和指针来完成对main函数中变量的赋值。
-
#include<iostream>
-
#include<string>
-
using namespace std;
-
-
//函数声明
-
void askForInfo(string *pName, int *pAge, int *pNumPets);
-
void writeInfo(string name, int age, int numbers);
-
-
int main()
-
{
-
string name;
-
int age, numPerts;
-
-
//使用取地址运算符,将变量地址传给函数
-
askForInfo(&name, &age, &numPerts);
-
-
//这里不需要使用指针,将变量的地址传给函数
-
writeInfo(name, age, numPerts);
-
-
return 0;
-
}
-
-
void askForInfo(string *pName, int *pAge, int *pNumPets)
-
{
-
cout << "\n Please enter your name: " << endl;
-
getline(cin, *pName);
-
cout << "Please enter you age: " << endl;
-
cin >> *pAge ;
-
cout << "Please enter the num of perts: " << endl;
-
cin >> *pNumPets;
-
cin.ignore();
-
}
-
-
void writeInfo(string name, int age, int numPerts)
-
{
-
cout << "\n Hi " << name << "!\n I see that you are " << age << "years old abd have " << numPerts << "perts.";
-
}
//程序结果如下所示:
Please enter your name:
aa
Please enter you age:
20
Please enter the num of perts:
10
Hi aa!
I see that you are 20years old abd have 10perts.请按任意键继续. . .
六,引用参数
在使用引用进行函数的引用调用中,函数的原型以及其头部声明中都包含引用参数,这里使用&而不是*,这里的&称为“引用”。而在调用函数的语句中只需要给出变量名就可以了,不需要注明&运算符。
使用引用进行函数的引用调用 把某一变量的地址赋给函数中的引用变量。
引用参数 使用运算符&声明的参数,实际上是一个指针。
在使用这种引用调用机制中,我们向函数传递的是地址,而函数则通过该地址来访问
调用它的函数的数据。虽然使用引用参数进行函数的引用调用时向函数传递的参数是地址,但我们不需要使用间接运算符来实现对数据的访问。
引用参数在函数声明时需要使用引用运算符“&”。实际上,引用参数会告诉程序:“这其实是个地址,就把它当做地址来处理好了。而且既然我们都知道这一点,就不再使用地址或间接运算符了。”
在使用引用进行的引用调用中,函数的调用语句中只包含变量的名称,而实际上传递的却是变量的地址。
阅读(1025) | 评论(0) | 转发(0) |