计算机系统应用教程网站

网站首页 > 技术文章 正文

第一章 C++指针

btikc 2024-09-12 12:07:23 技术文章 13 ℃ 0 评论

指针变量的定义

可以通过指针访问内存,地址才可以访问内存,所以指针就是一个地址

int main() {
      //整形变量的定义
      int a = 10;
      //指针变量的定义
      int * p;
      //指针变量的赋值
      p = &a;
      //打印a的地址
      cout << &a << endl;
      cout << p << endl;
      //指针的取值(解引用)
      cout << *p << endl;
      return 0;
}

指针所在的内存空间

指针的内存空间大小和机器字长(编译器)相关,32位占用4个字节,64位占用8个字节。

int main() {
      //整形变量的定义
      int a = 10;
      //指针变量的定义
      int * p;
      //指针变量的赋值
      p = &a;
      cout << sizeof(p) << endl;
      cout << sizeof(int *) << endl;
      cout << sizeof(float *) << endl;
      cout << sizeof(double *) << endl;
      return 0;
}

可以通过不同的编译器编译后运行,查看32位编译器和64位编译器的指针大小是否有差异。

空指针和野指针

  • 空指针

空指针是指向地址0的指针。

地址0~255是不能访问的,所以正常分配的地址空间,指针是不可能指向0~255的。

int main() {
      //空指针
      int * p = NULL;
        //下面将会报空指针异常,空指针不能访问
        *p = 100;
        return 0;
}
  • 野指针

野指针是指针指向了非法的内存空间。

一般野指针的出现是变量声明时没有默认初始化,或者堆内存删除后没有指向NULL(0)。

Warning : 所以指针变量定义的时候最好初始化,或者设置为 NULL。堆内存释放后,也要顺便设置为NULL。养成好习惯。

int main() {
      //野指针,(将0x1111强制类型转化为地址)
      int * p = (int *)0x1111;
      //访问权限错误
        cout << *p << endl;
        return 0;
}

const 修饰指针

  • 常量指针

指针指向的值不可改,指针指向可以修改。

int main() {
      int a = 0;
      int b = 0;
      const int * p = &a;
      //错误,指针指向的值不可改
      //*p = 1; 
      //正确,指针指向可以修改
      p = &b;
      return 0;
}

记忆小技巧

const int * p

中文:const 是常量,int是类型, * 是指针, p是变量。

顺序是常量然后是指针,所以叫做常量指针。

const 在指针*前面,所以修饰的就是指针,所以*p的操作就会报错。

  • 指针常量

指针指向的值可改,指针指向不可修改。

int main() {
      int a = 0;
      int b = 0;
      const int * p = &a;
      //正确,指针指向的值可改
      *p = 1; 
      //错误,指针指向不可以修改
      //p = &b;
      return 0;
}

记忆小技巧

int * const p

中文:const 是常量,int是类型, * 是指针, p是变量。

顺序是指针然后是常量,所以叫做指针常量。

const 在变量p前面,所以变量就变为了常量,所以p=&b对常量进行修改就是错误的。

  • 修饰指针和变量

const int * const p

这里就不讨论了,既不能修改指针操作,又不能修改变量指向。

指针操作数组

int main() {
      int array[10] = {1,2,3,4,5,6,7,8,9,10};
      int *p = array; //array就是数组的首地址
      //打印第一个数组元素
      cout << *p << endl;
      //因为是int型(int 32位是4个字节),p++会在内存中后移4个字节
      p++;
      //打印第二个元素
      cout << *p << endl;
      return 0;
}

指针访问数组技巧

int main() {
      int array[10] = {1,2,3,4,5,6,7,8,9,10};
      //数组大小
      int array_size = sizeof(array);
      //数组元素大小
      int element_size = sizeof(array[0]);
      //数组长度
      int length = array_size / element_size;
      return 0;
}

通过sizeof(数组名)可以获取数组的总大小。

二维数组同样适用。

int main() {
      int array[2] [3]=  { {1,2,3}, {4,5,6} } ;
      //数组大小
      int array_size = sizeof(array);
      //一维数组大小
      int array_zero_size = sizeof(array[0]);
      //元素大小
      int element_size= sizeof(array[0][0]);
      return 0;
}

注意 : 二维数组的数组名 array_pt++, 是移动一个一维数组大小的长度。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表