目录
1,指针的理解
指针可以理解为地址,我们在编译器上创建的所有变量都会被计算机分配地址,只是我们将这个地址称为指针。通过指针我们可以查找和修改这些变量。
“ & ” 是取地址符号,它是运算符,它的作用就是取一个变量的指针。
int a = 0;
此时a会被分配一个整形指针,&a取就是它的指针。
(当然也可以说变量a被分配到一块空间上,&a就是它所在空间的起始地址)
2,指针变量的创建
指针变量也是一种变量,它的创建和其它形如整型变量,字符变量,数组变量的创建一样,都由变量类型和变量名称组成,也需要初始化,不要把它看作特殊的存在。
比如,现在有一个整形指针变量pa,注意这里我们必须要对它进行初始化,要不然pa就是一个野指针(就是说它的指向是未知的,如果不加以限制的对它进行操作就会引发程序错误),所以可以初始化一个NULL,代表这个指针的指向是空的。操作如下:
int* pa = NULL;
int a = 0;
pa = &a;
这里我们就成功的创建了一个整形指针变量,还将一个整形的指针赋值给了它。
“ * ” 代表pa是一个指针变量,int 代表pa这个指针变量的类型为整形指针,所以pa是一个整形指针变量。下面写一个字符指针变量:
char c = 'a';
char* pc = &c;
注意:这里有一个小细节,在创建指针变量的时候,*其实是和变量待在一起的,就比如说整形变量的创建可以这样写:
int a = 0,b = 0;
那么整形指针变量呢?
它应该这样写:
int* a = NULL,*b = NULL;
所以创建多个变量的时候一定要注意对 “ * ” 的理解,尤其是在创建结构体变量的时候。
3,指针的解引用
介绍完指针的创建后,我们应该如何运用指针呢?通过解引用操作,我们可以修改指针所指向的内容。比如:
int a = 0;
int* p = &a;
对指针变量进行解引用:
p为指针变量,当我们要通过指针对变量进行修改时,解引用:
*p = 1;
此时变量a的内容由0改为了1,这就是对指针变量的解引用。
4,指针的大小
指针的大小取决于操作系统,如果是32位操作系统,那么指针的大小为4个字节,64位系统,则是8个字节大小。
32位:4字节
64位:8字节
说到这里便有一些疑惑,我们之所以将指针进行区分,说明不同的指针类型应该有所区别才对,那么现在所有指针的大小都相同,那么指针变量的类型究竟有什么意义呢?
5,指针变量类型的意义
指针变量的类型肯定是有很重要的意义的,按照一般思维,我们会认为指针变量的大小应取决于其类型,因为int类型的变量总是占4个字节,char类型的变量总是占1个字节,这是我们所知道的。但其实在某种程度上,也可以说指针变大小与其类型有关。
指针的大小的确是固定的,但在对指针进行操作时,是按指针变量类型的大小来进行操作的:
int a = 1000;
char* p1 = (char*)&a;
*p1=0;
printf("%d\n", a );
程序输出后的结果不是1000,而是768,这是因为在内存中,a原本占4个字节,原本最低为字节为 e8,用char*的类型取地址后进行解引用,此时再对*p1进行修改时是按char类型的大小来的,因此只把e8这一个字节的数字修改为0:
修改前: 修改后:
(注意:这里显示的是1000以16进制 “ 3e8 ” 存储在0x0115f778上,且是小端存储,按照单个字节从左到右读,再整体上从右到左读,即读出 “ 00000300 ”,16进制 “ 300 ” 转10进制即为 768 )