记录一,变量与指针:
分析一:
1、定义并初始化一个整型变量 mei,变量名是 mei,变量当前值是 210;
2、变量名实际上是一个符号地址,在系统对程序进行编译时,给每一个变量名分配一个具体的内存地址;
3、变量值是变量名对应的存储单元所存放的具体的数值;
4、变量的数据类型是指变量可以存储的数据的类型,也就是变量值的数据类型,不同的数据类型在内存中占据的内存单元长度不同;
5、程序运行时,从变量中取值,实际上是通过变量名找到对应的内存地址,从此内存地址中读取数据(变量值);
6、变量名与内存中的一个地址相对应,每个变量与其对应的具体地址的联系由C/C++编译系统完成;
7、程序中对变量进行存储操作,也即是对该变量所对应地址的存取单元(若干字节)进行存取操作(直接存取);
8、所以,可以简化的从表面理解:变量名就代表了一个内存地址,而内存地址是存放数据的,也就是通俗的说变量 mei存放了数值 210。
分析二:
1、定义并初始化一个整型指针变量 dai,变量名是 dai,变量当前值是 变量mei的地址;
2、计算机内存是以字节为单位的连续的存储空间,每个字节都有一个编号,这个编号称为地址,由于内存的存储空间是连续的,所以编号也是连续的;
3、一个变量所占据内存区域一段连续字节中的第一个字节地址,就称为该变量的地址;
4、一个变量的内存地址称为该变量的指针;
5、也可以定义一个变量用于存放指针(变量的内存地址),这种变量就是指针变量,也简称指针;
6、如图:
(1)变量mei的地址是:50012;指针变量dai的地址是:40008,因为指针变量也是一个变量,会存放数据(别的变量的内存地址),所以也会为指针分配内存空间的,只是记得:不管什么类型的指针变量,指针变量本身都是整型的,内存空间都是一样的,如 C++ 4字节 (c语言是2个字节)——32位系统;跟系统有关,16位地址,指针即为2个字节,32位系统,是4个字节,64位,则就为8个字节。
(2)dai存放的值是变量mei的地址:50012;mei存放的值是:数值56;
(3)直接对mei访问:cout << mei; 就是直接对内存 50012访问(直接存取),会得到此内存地址存放的数据:210;
(4)也可以通过指针变量dai访问变量mei(的值210),即是先直接对dai访问:cout << dai; 就是直接对内存 40008访问(直接存取),会得到此内存地址存放的数据(是mei的地址):50012,再去访问此地址,就得到了数值210;即是通过指针dai访问到了变量mei的值,这个是间接存取:cout << *dai << endl;
(5)“ * ” 作为单目运算符,用于指针变量就是取内容运算符,也成指针运算符、间接访问运算符;所以 *dai 代表dai的值(内存地址)所对应的那片内存空间存放的值,就是 210;
(6)“ & ” 作为单目运算符,用于变量就是取地址运算符,&mei 就是取出变量mei对应的内存地址50012;
记录二,数组与指针数组:
分析一:
(1)一个整型数组var;一个整型指针数组ptr;
(2)对指针数组每一个元素(指针)赋值(ptr[i] = &var[i];):把数组var每一个元素的地址,分别赋值给指针数组的每一个元素;
(3)指针数组, 它的本质是存储指针的数组, 既存储 int 类型的指针的数组, 数组内的每个元素都是一个指针,指向一个存储 int 类型的地址。
(4)其他所有知识点与记录一是一致的,只是这是数组(多个变量的集合)而已;
记录三,数组与指针:
分析一:
(1)数组名aa其实已经“退化”,很肤浅的使用,就是可以“当作” 一个指针了,它对应数组aa的所有值在连续内存空间中的首地址,但是千千万万记得,数组(名)就是数组(名),绝对不是指针。
(2)&aa 和 aa 输出都是:0x7ffc61c5cf70,也是数组aa的首地址;对数组名取地址&是合法的,但有些编译器不推荐这样做,对数组名取地址的结果与直接使用数组名的结果是一致的,这是C/C++语言的一种特殊规定。但是,这两者是有不一样含义的:
&aa + 1 : 0x7ffc61c5cf90 //加了4个double地址:32字节 (整体)
aa + 1 : 0x7ffc61c5cf78 //加了一个double地址:8字节 (个体)
所以,aa 可以理解为指向一个4元素数组首地址的指针类型,而&aa 可以理解为指向一个含4个元素的数组整体的指针,注意区别整体与个体。
(3)ppp 是一个指针,所以它有自己的地址(内存空间):&ppp :0x7ffc61c5cf68;它存放的值是aa数组的首地址:ppp: 0x7ffc61c5cf70;aa也代表数组的首地址,所以在访问数组元素这个使用上ppp就等同aa了;
(4)总结一下两者的区别:
1、指针是需要占用内存空间来存储地址的;数组名是一个常量,可以修改指针指向的内容,无法改变数组名的指向;
2、数组和指针对于sizeof来说是不同的,指针变量占用的空间通常等于当前CPU的最大位数,数组名取sizeof的话,得到的则是数组的大小;
3、用extern声明一个外部变量,指针和数组不能混用。如在文件1.cpp里声明了char ca[]="abcde",在文件2.cpp里引用,必须是extern char ca[],而不能extern char * ca,因为前者是常量,后者是一个占用了内存空间的指针变量,区别很大;
记录四,字符串指针(这个还没有理解彻底,日后再补充):
分析一:
(1)const char *sarr = "abcdefg"; 将字串常量赋值给字符指针变量:
将字符串常量 abcdefg 存放在常量区,是一个无名存储区(或称无名数组);
把此无名存储区的首地址赋值给 sarr;
sarr 就指向了字符串中的第一个字符 a;
字符串 abcdefg 依次存入首地址开始的连续存储单元中;
系统在字符串尾加上了'\0';
(2)C++ 的 cout << sarr << endl; 会直接输出字符串值 abcdefg,而不是sarr这个指针变量的值(即是无名存储区的首地址)——目前只是知道这样,不知道为什么?
记录五,字符串指针数组(这个还没有理解彻底,日后再补充):
分析一:
(1)知识点参考记录四的字符串指针即可;
记录六,再看字符串指针数组和字符串指针(这个还没有理解彻底,日后再补充):
分析一:
(1)知识点参考记录四的字符串指针即可;