C/C++ language 指针教程
更新日期:
文章目录
// xx.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
int main( )
{
cout<<"C/C++ language 指针教程"<<endl<<endl;
cout<<"指针、引用和取值"<<endl<<endl;
cout<<"什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量。在这份教程里“引用”表示计算机内存地址。从指针指向的内存读取数据称作指针的取值。指针可以指向某些具体类型的变量地址,例如int、long和double。指针也可以是void类型、NULL指针和未初始化指针。本文会对上述所有指针类型进行探讨。"<<endl<<endl;
cout<<"根据出现的位置不同,操作符 既可以用来声明一个指针变量,也可以用作指针的取值。当用在声明一个变量时,表示这里声明了一个指针。其它情况用到表示指针的取值。"<<endl<<endl;
cout<<"&是地址操作符,用来引用一个内存地址。通过在变量名字前使用&操作符,我们可以得到该变量的内存地址。"<<endl<<endl;
// 声明一个int指针
int ptr;
// 声明一个int值
int val0 = 1;
// 为指针分配一个int值的引用
ptr = &val0;
// 对指针进行取值,打印存储在指针地址中的内容
int deref = ptr;
cout<<"deref ="<<deref<<endl<<endl<<endl;
//**
cout<<"void指针、NULL指针和未初始化指针"<<endl<<endl;
cout<<"一个指针可以被声明为void类型,比如void x。一个指针可以被赋值为NULL。一个指针变量声明之后但没有被赋值,叫做未初始化指针。"<<endl<<endl;
int uninit; // int指针未初始化
int nullptr1 = NULL; // 初始化为NULL
void vptr; // void指针未初始化
int val = 1;
int iptr;
int castptr;
// void类型可以存储任意类型的指针或引用
iptr = &val;
vptr = iptr;
cout<<"iptr="<<iptr<<" vptr="<<vptr<<endl;
// 通过显示转换,我们可以把一个void指针转成
// int指针并进行取值
castptr = (int )vptr;
cout<<"castptr="<<castptr<<endl;
// 打印null和未初始化指针
cout<<"nullptr="<<nullptr1<<endl<<endl<<endl;
//cout<<"uninit="<< uninit<<endl;
//**
cout<<"指针和数组"<<endl<<endl;
cout<<"C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象。与之相反,指针用来存储单个内存地址。数组和指针不是同一种结构因此不可以互相转换。而数组变量指向了数组的第一个元素的内存地址。"<<endl<<endl;
cout<<"一个数组变量是一个常量。即使指针变量指向同样的地址或者一个不同的数组,也不能把指针赋值给数组变量。也不可以将一个数组变量赋值给另一个数组。然而,可以把一个数组变量赋值给指针,这一点似乎让人感到费解。把数组变量赋值给指针时,实际上是把指向数组第一个元素的地址赋给指针。"<<endl<<endl;
int myarray[4] = {1,2,3,0};
int ptrArr = myarray;
cout<<"ptrArr="<<ptrArr<<endl<<endl<<endl;
// 数组变量是常量,不能做下面的赋值
// myarray = ptr
// myarray = myarray2
// myarray = &myarray2[0]
//**
cout<<"指针与结构体"<<endl<<endl;
cout<<"就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址。与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型。"<<endl<<endl;
struct person {
int age;
char name;
};
struct person first;
struct person ptrStruc;
first.age = 21;
char *fullname = "full name";
first.name = fullname;
ptrStruc = &first;
cout<<"age="<<first.age<<" name="<<ptrStruc->name<<endl<<endl<<endl;
return 0;
}