指针本质分析

lsfreeing 2020-01-10

指针本质分析
  1. 变量回顾:程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间?
  2. 可以通过指针改变另一个变量的值
  3. 指针的本质为变量(只要是变量,就有地址),不过说这种变量很特殊,它存储的是变量的地址值
  4. 在指针声明时,*号表示所声明的变量为指针
  5. 在指针使用时,*号表示取指针所指向的内存空间的值
  6. *号类似一把钥匙,通过这把钥匙可以打开内存,读取内存中的值
  7. 不同的指针,所占用的内存是一样的。所有的32位系统中,指针所占用的的字节是4
传值调用与传址调用
  1. 指针是变量,因此可以声明指针参数
  2. 当一个函数体内部需要改变实参的值时,需要使用指针参数
  3. 函数调用时,实参值将复制到形参
  4. 指针适合复杂数据类型的函数参数中
常量与指针
const int*p;             //p可变,p指向的内容不可变
int const*p;             //p可变,p指向的内容不可变
int* const p;            //p不可变,p指向的内容可变
const int* const p;      //p和p所指向的内容都不可变
口诀:左数右指,当const出现在*号左边时指针指向的数据为常量当const出现在*号右边时指针本身为常量
#include <stdio.h>
int main()
{
     int i = 0;
     const int *p1 = &i;
     int const *p2 = &i;
     int* const p3 = &i;
     const int * const p4 = &i;
     p1  = NULL; //ok
     *p1 = 1;    //error
     p2 = NULL;  //ok
     *p2 = 1;    //error
     p3 = NULL;  //error
     *p3 = 1;    //ok
     p4 = NULL;  //error
     *p4 = 1;    //error
     return 0;
}

运行结果:

1>------ 已启动全部重新生成:  项目: 常量和指针, 配置: Debug Win32 ------
1>  main.c
1>j:\c语言练习题\常量和指针\常量和指针\main.c(15): error C2166: 左值指定 const 对象
1>j:\c语言练习题\常量和指针\常量和指针\main.c(18): error C2166: 左值指定 const 对象
1>j:\c语言练习题\常量和指针\常量和指针\main.c(20): error C2166: 左值指定 const 对象
1>j:\c语言练习题\常量和指针\常量和指针\main.c(23): error C2166: 左值指定 const 对象
1>j:\c语言练习题\常量和指针\常量和指针\main.c(24): error C2166: 左值指定 const 对象
========== 全部重新生成:  成功 0 个,失败 1 个,跳过 0 个 ==========

相关推荐