小言_互联网的博客

C++学习(3)

212人阅读  评论(0)

一、指针的基本概念

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

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

4.1 const修饰指针

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

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

4.2 const修饰常量


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

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

4.3 const修饰常量和指针


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

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

这个图片有问题 但是我也没有重新去画了。


转载:https://blog.csdn.net/weixin_51178981/article/details/124975971
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场