永不秃头的程序员

永不秃头的程序员

一、指针的基本概念

首先指针是用来存放的地址,并不是值,所以最开始学习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;
}

C++学习(3)-LMLPHP

二、指针所占用的空间

因为指针的是一个内存,所以我们规定:
在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;
}

C++学习(3)-LMLPHP

我们操作系统是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有几种用法:

  1. const修饰指针
  2. const修饰常量
  3. const修饰常量和指针

4.1 const修饰指针

C++学习(3)-LMLPHP

如图 const修饰指针的意思就是:我可以修改指针指向的地址,但是不能修改地址中的值。

const int * p;
*p = 20;  //错误
p = &a;  //正确

4.2 const修饰常量

C++学习(3)-LMLPHP
如图 const修饰常量的意思就是:我能修改地址中的值,但是修改指针指向的地址。

const int * p;
*p = 20;  //正确
p = &a;  //错误

4.3 const修饰常量和指针

C++学习(3)-LMLPHP
如图 const修饰常量的意思就是:我不能修改地址中的值,也不能修改指针指向的地址。

const int * p;
*p = 20;  //错误
p = &a;  //错误
10-10 20:40