一、指针的基本概念
首先指针是用来存放的地址,并不是值,所以最开始学习C的时候总有那么一句话,指针就是地址。
据个例子:
#include <iostream>
using namespace std;
int main ()
{
int var1;
char var2[10];
cout << "var1 变量的地址: ";
cout << &var1 << endl;
cout << "var2 变量的地址: ";
cout << &var2 << endl;
return 0;
}
二、指针所占用的空间
因为指针的是一个内存,所以我们规定:
在32位操作系统下,无论什么类型的指针都占用4个字节
在64位操作系统下,无论什么类型的指针都占用8个字节
#include <iostream>
using namespace std;
int main ()
{
int a = 10;
int *p = &a;
cout << "指针占用的大小为:" << sizeof(p) << endl;
cout << "int 指针占用的大小为:" << sizeof(int *) << endl;
cout << "char 指针占用的大小为:" << sizeof(char *) << endl;
cout << "double 指针占用的大小为:" << sizeof(double *) << endl;
cout << "float 指针占用的大小为:" << sizeof(float *) << endl;
return 0;
}
我们操作系统是64位的,所以都是8个字节。
三、空指针和野指针
空指针无法进行访问
空指针是指向内存为0的地址
#include <iostream>
using namespace std;
int main ()
{
//空指针,无法访问
int *p = NULL;
*p = 100;
return 0;
}
他的编译是不会报错的,因为你的语法是符合规范的,但是你执行的时候会报错,因为你访问不了这个指针
cluo@cluo:~/c++$ vi Pointer-3.c
cluo@cluo:~/c++$ g++ Pointer-3.c
cluo@cluo:~/c++$ ./a.out Pointer-3.c
段错误 (核心已转储)
野指针是指向一个非法空间的指针。
#include <iostream>
using namespace std;
int main ()
{
//野指针,无法访问
int *p = (int *)0x100;
cout << *p << endl;
return 0;
}
cluo@cluo:~/c++$ vi Pointer-4.c
cluo@cluo:~/c++$ g++ Pointer-4.c
cluo@cluo:~/c++$ ./a.out Pointer-4.c
段错误 (核心已转储)
这段代码报错的原因是我们没有对 0x100这个地址进行申请,进而直接访问,我们不知道这块地址是否已经被占用,或者没有权限.
四、const修饰指针
const有几种用法:
- const修饰指针
- const修饰常量
- const修饰常量和指针
4.1 const修饰指针
如图 const修饰指针的意思就是:我可以修改指针指向的地址,但是不能修改地址中的值。
const int * p;
*p = 20; //错误
p = &a; //正确
4.2 const修饰常量
如图 const修饰常量的意思就是:我能修改地址中的值,但是修改指针指向的地址。
const int * p;
*p = 20; //正确
p = &a; //错误
4.3 const修饰常量和指针
如图 const修饰常量的意思就是:我不能修改地址中的值,也不能修改指针指向的地址。
const int * p;
*p = 20; //错误
p = &a; //错误