指针(pointer)——C_C++的精髓

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(pointer)——C/C++的精髓!你不得不学好它!

指针(pointer)

指针是一种数据类型,用于存放某个变量的地址值。此时该指针被称为是指向该变量。

一个指针的类型决定于它所指向的变量的类型。

指针既可指向基本数据类型(即预定义数据类型),又可指向数组、函数、类和文件等用户自定义数据类型。

指针可以初始化为0、NULL(即0,这是标准库头文件中定义的符号化常量)或一个地址。内容为0或NULL的指针不指向任何变量,称为空指针。

例如:

int a;

int *ptr;

指针ptr在下式中被初始化为指向变量a。

ptr = &a;

两条语句也可组合地表示为:

a = *ptr;

其中&为存地址运算符,而*则为取内容运算符。

ptr

a

int a, *ptr;

ptr = &a;

指针与数组

数组名是一个指向该数组的常量指针(其值不能改变),也是该数组中首单元的地址值。一维数组的指针如下:

int arr[5] = { 1, 3, 5, 7, 9 };

int *ptra;

ptra = arr;

ptra

数组指针与数组名两者的异同:

(1)整型变量指针ptr与整型数组指针ptra的说明格式相同,其间空格可放可不放。

(2)arr既是数组名,又是数组地址,还是数组指针(称为常量指针),三位一体。因此arr可在一定范围内与ptra等效地使用。[ ]可在一定范围内与* 等效地使用。但arr不准重新赋值。例如:

arr[0]即*arr即*ptra即ptra[0] = 1

arr[3]即*(arr+3)即*(ptra+3)即ptra[3] = 7

但arr的使用不如ptra灵活,如:

不允许*arr++,而允许*ptra++。

见以下例子:§2.2中[例1]的主程序

void main()

{

int arr[5] = {1, 3, 5, 7, 9};

for ( int i = 0; i < 5; i++)

cout << arr[i] << endl; //数组名

}

其中的for语句可改为:

for ( int i = 0; i < 5; i++)

cout << *(arr+i) << endl; //指针

// 但不允许arr加减,即不允许:

// cout << *(arr++) << endl; not allowed

但可使用以下指针ptra:

int *ptra = arr;

for ( int i = 0; i < 5; i++)

cout << *(ptra++) << endl;

// 此处可以将指针加减

(3)字符串与字符数组:

字符串一般使用指针(包括变量指针和常量指针两种方式)表示其地址和内容,此地址也即其第一个字符的地址。

第一种变量指针方式例如:

char *ch_ptr = "home"; (ch_ptr为变量指针)。

第二种常量指针方式例如:

int arr[5] = {1, 3, 5, 7, 9}; (arr为常量指针)。此处字符数组名是一个指向该数组的常量指针,它不能重新赋值。

[例]两种指针方式及其地址和字符串内容

// str_ptr_&_array_1.cpp

#include

#include

void main()

{

char *nm = "Nice";

char name[ ] = "OK";

cout<<"Addresses of the pointers 'nm' and 'name' themselves:"<

cout<<"'nm' is at "<<&nm<<", 'name' is at "<<&name<

cout<

cout<<", 'name' points to 0x"<<(int)name<

cout<<"Character strings are '"<

cout<

}

/* Results:

Addresses of the pointers 'nm' and 'name' themselves:

'nm' is at 0x0065FDF4(栈区), 'name' is at 0x0065FDF0(栈区)

'nm' points to 0x42608C(数据区), 'name' points to 0x65FDF0(栈区)Character strings are 'Nice' and 'OK' respectively.

*/

说明:我在编程时的数据与此相差很大,读者需要自行地将上述代码运行一下...

程序中cout<<(int)name用于读取指针内容即指针所指向的地址(字符串地址);而cout<

指向指针的指针

例如:

int i=5;

int *ptr = &i;

int **pp = &ptr;

即:

指向指针ptr的指针整型变量i的指针整型变量pp

ptr = &i

i = 5

可表示为:

i = *ptr;

相关文档
最新文档