基本概念
1)每一个变量都有一个内存位置,每一个内存位置都有对应的内存地址,可以通过连字号(&)运算符访问,如:
#include <iostream>
using namespace std;
int var1;
char var2[10];
cout << "var1变量的地址:";
cout << &var1 << endl;
cout << "var2变量的地址:";
cout << &var2 << endl;
2)指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。
用指针存储其他变量地址之前,需要对其进行声明。
int *ip;
float *fp;
double *dp;
char *ch;
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数,大小均为4个字节。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
3)通过使用一元运算符 * 来返回位于指针变量所指定地址的变量的值
4)在初始化时,一般用空指针NULL。NULL指针是一个定义在标准库中的值为零的常量。
int *ptr = NULL; // 此时,ptr的值为 0
在大多数操作系统上,程序不允许访问地址为0的内存,因为该内存是操作系统保留的。内存地址0有特别重要的意义,他表明该指针不指向一个可访问的内存位置。
指针类型
1)指向整型的指针
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int *p = &a; // *p输出为5, p输出为变量a的地址
}
&用于取变量的地址,*用于取指针变量所指地址的值
2)指向字符型的指针
#include <iostream>
using namespace std;
int main()
{
char c[] = "bubuday"; //等价于 char *c = "bubuday"; 所以c的类型为 char *
char *p = c; // 等价于, char *p; p = c;
cout << c << endl;
cout << p << endl;
cout << *p << endl;
return 0;
}
输出为:
3)指向整型指针的指针
#include "stdafx.h"
#include<iostream>
using namespace std;
int main()
{
int a = 1;
int *ip = &a;
int **ipp = &ip; // 指向整型指针的指针ipp
cout << *ip << endl;
cout << **ipp << endl;
return 0;
}
输出均为1。
4)指向 字符指针数组 的指针
char *c[] = {"bubu", "day"};
char **c = {"bubu", "day"}; // 错误,c为指向指针的指针,*c为存储某一内存地址的指针,均只有一个存储单元
char **p;
p = c;
char *ca = "dooo";
c[0] = ca;
cout << *p << endl;
// 输出为 dooo
字符指针数组:char *c[] = {"bubu", "day"};
指向字符指针的指针 char **p
c和p的类型均为char **