1. 什么是指针?
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
总结:
所以指针是一个变量,用来保存内存地址的变量。
指针是用来存放地址的,地址是唯一标示一块地址空间的。
指针的大小在32位平台是4个字节,在64位平台是8个字节。
2. 指针类型和解引用
指针的定义方式是: type + * 。
其实: char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
总结:
指针的类型决定了指针向前或者向后走一步有多大(距离)。
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个节)。
char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
3. 指针的运算
指针的递增与递减:
指针的每一次递增,它其实会指向下一个元素的存储单元。
指针的每一次递减,它都会指向前一个元素的存储单元。
指针在递增和递减时跳跃的字节数取决于指针所指向变量数据类型长度,比如 int 就是 4 个字节。
指针可以用关系运算符进行比较,如 ==、< 和 >。如果 p1 和 p2 指向两个相关的变量,比如同一个数组中的不同元素,则可对 p1 和 p2 进行大小比较。
4. 指针的具体应用
字符指针:
C/C++会把常量字符串存储到单独的一个内存区域,当几个指针,指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。
char str1[] = "hello bit.";
char str2[] = "hello bit.";
char *str3 = "hello bit.";
char *str4 = "hello bit.";
if(str1 ==str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if(str3 ==str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
这段代码的运行结果是:
str1 and str2 are not same
str3 and str4 are same
数组指针与指针数组:
int *p1[10];
int (*p2)[10];
//p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。
//所以p是一个指针,指向一个数组,叫数组指针。
//[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
&arr 表示的是数组的地址,而不是数组首元素的地址。
数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是整个数组的大小。
数组名的意义:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址
5. 什么是引用?
类型有 基本数据类型 和 复合类型 ;
基本数据类型,如int,char等基本数据类型;
复合类型:指针 和 引用;
引用:为对象起立另一个名字,引用类型引用另一种类型。
引用并非对象,相反的,它只是为一个已存在的对象所起的另外一个名字。
6. 引用的使用
int a = 10;
int ra = &a; //引用的定义
引用必须进行初始化,定义了一个引用之后,对其进行的所有操作都是在与之绑定的对象上进行的。
为引用赋值,实际上是把值赋给了与引用绑定的对象;
获取引用的值,实际上是获取了与引用绑定的对象的值;
以引用对象作为初始值,实际上是以与引用绑定对象的作为初始值。
引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起;
引用的基本数据类型必须与引用对象的基本数据类型一样。
7. 指针与引用的区别
1. 引用在定义时必须初始化,指针没有要求
2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在 任何时候指向任何一个同类型实体
3. 没有NULL引用,但有NULL指针
4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
6. 有多级指针,但是没有多级引用
7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
8. 引用比指针使用起来相对更安全