【C++ 学习】指针

******

1.指针变量是 专门存放地址 的变量,所以对它进行赋值时只能赋值 地址;

2.指针的初始化:   int* ptr = null;  和 int *ptr = null; 是一样的,但是只有ptr 是代表指针变量, *ptr 代表的是指针引用;

3.*ptr 代表是 “ 对指针变量ptr 进行* 运算”

4. int* ptr =&a   合法(对指针变量 ptr 赋值 &a);      int* ptr = null ;   *ptr =a ;  合法(指针变量ptr 进行* 运算后值为a)

 

1.数据类型

 

类型 范围
char 1 个字节 -128 到 127 或者 0 到 255
unsigned char 1 个字节 0 到 255
signed char 1 个字节 -128 到 127
int 4 个字节 -2147483648 到 2147483647
unsigned int 4 个字节 0 到 4294967295
signed int 4 个字节 -2147483648 到 2147483647
short int 2 个字节 -32768 到 32767
unsigned short int 2 个字节 0 到 65,535
signed short int 2 个字节 -32768 到 32767
long int 8 个字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
signed long int 8 个字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long int 8 个字节 0 to 18,446,744,073,709,551,615
float 4 个字节 +/- 3.4e +/- 38 (~7 个数字)
double 8 个字节 +/- 1.7e +/- 308 (~15 个数字)
long double 16 个字节 +/- 1.7e +/- 308 (~15 个数字)
wchar_t 2 或 4 个字节 1 个宽字符

1.typedef 声明

可以使用 typedef 为一个已有的类型取一个新的名字:

typedef int feet;  ---->  feet 是 int 的另一个名称:

2.枚举类型

如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型:

所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。

const 关键字

 

 

 

 

1.变量

变量(variable) :当你申明一个变量的时候,计算机会将指定的一块内存空间和变量名进行绑定;

例: int x = 5 :  将5赋值于名字叫做“x”的内存空间 ---> 叫做“x”的内存空间里,存储着的数据是“5”

 变量在内存中的操作其实是需要经过2个步骤的:

1)找出与变量名相对应的内存地址。

2)根据找到的地址,取出该地址对应的内存空间里面的值进行操作。

2,指针的结构和原理

1.指针变量和任何变量一样,也有变量名,和这个变量名对应的内存空间;

2.指针的特殊之处在于:指针变量相对应的内存空间存储的值恰好是某个内存地址;

int x = 5;
int *ptr = &x;

3:引用在内存中的结构和原理

reference是一种特殊的pointer

 

 

二.对char* 和 char[]区别的一些理解

1.相同点:

1. 这两种类型都可以对应一个字符串,比如:

char * a=”string1”; 
char b[]=”string2”; 

其中a是一个指向char变量的指针,b则是一个char数组(字符数组);

2.很多时候二者可以混用,像函数传参数的时候,实参可以是char*,形参可以是 char[]

void fun1(char b[]){ 
    printf(“%s”,b); 
} 


int main(){ 
    char *a=“HellowWorld”; 
    fun1(a); 
} 

 

3. char b[]="string"  中,变量b 是“一个char 型数组的名字(被引用时)” ,同时也是“该数组首元素的地址(被赋值时)”

可以直接这样赋值(char[])b =(char*)a

注: char *a = null;   

         a=&b;// a 可以赋值为 &b , 并不代表 a 的类型和&b 相同。可以赋值,不代表2变量类型相同

2.不同点 

1.(char*)a 是变量,值可以改变, (char[])b 是常量,值不能改变:

char * a=”string1”; 
char b[]=”string2”; 

a=b; //OK
 
a=”string3”; //OK  --> ( 与  char* a = "string"  定义相同)
 
b=a; //报错!左边操作数只读 

b=”string3” //报错!左边操作数只读

a是一个char型指针变量,其值(指向)可以改变;b是一个char型数组的名字,也是该数组首元素的地址,是常量,其值不可以改变 。

2.char[]对应的内存区域总是可写,char*指向的区域有时可写,有时只读

char * a=”string1”; 
char b[]=”string2”; 
gets(a); //试图将读入的字符串保存到a指向的区域,运行崩溃! 
gets(b) //OK 

a指向的是一个字符串常量,即指向的内存区域只读; b始终指向他所代表的数组在内存中的位置,始终可写! 

char * a=”string1”; 
char b[]=”string2”; 
a=b; //a,b指向同一个区域,注意这里改变了a的指向 
gets(a) //OK 

3.char * 和char[]的初始化操作有着根本区别:

char b[]=”string2”;则是实现了2个操作: 
1声明一个char 的数组, 
2为该数组“赋值”,即将”string2”的每一个字符分别赋值给数组的每一个元素,存储在栈上。 
最终的结果:“数组的值”(注意不是b的值)等于”string2”,而不是b指向一个字符串常量

PS: 
实际上, char * a=”string1”; 的写法是不规范的! 
因为a指向了即字符常量,一旦strcpy(a,”string2”)就糟糕了,试图向只读的内存区域写入,程序会崩溃的!尽管VS下的编译器不会警告,但如果你使用了语法严谨的Linux下的C编译器GCC,或者在windows下使用MinGW编译器就会得到警告。

所以,我们还是应当按照”类型相同赋值”的原则来写代码: const char * a=”string1”; 
保证意外赋值语句不会通过编译。

 

小结

对于 
const char * a=”string1” 
char b[]=”string2”;

1.a是const char 类型, b是char const类型 
( 或者理解为 (const char)xx 和 char (const xx) )

2.a是一个指针变量,a的值(指向)是可以改变的,但a只能指向(字符串)常量,指向的区域的内容不可改变;

3.b是一个指针常量,b的值(指向)不能变;但b指向的目标(数组b在内存中的区域)的内容是可变的

4.作为函数的声明的参数的时候,char []是被当做char *来处理的!两种形参声明写法完全等效!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章