从本质上来说,指针(pointer)是一个值为内存地址的变量。它指出指针的两个核心:
①指针是一个变量。它具有和其他变量一样的属性:有名、有值、有地址(隶属“三友”集团)。
②指针的值是内存地址。这指出了指针区别于其他变量的特殊性,它的值是内存地址。
一、指针的命名
常用以下两个名字作为指针变量名:
①p(pointer的首字母)
②ptr(pointer各音节上的辅音字母)
二、指针的赋值
将一个普通变量girl的地址赋给指针ptr,可以用如下代码:
ptr = &girl; // 把girl的地址赋给ptr
&为取地址运算符,表示取后面东东的地址。
把girl的地址取出来赋给ptr,所以现在ptr的值就是girl的地址,就好比记下姑娘家的门牌号。
对于上面的赋值语句,我们常说ptr“指向”girl。这个指向关系是这样形成的:
有了这个指向关系,就能通过指针ptr找到girl。就好比你指向姑娘的家,在那儿就能找到那个姑娘一样。
三、获取指针指向的值
你存下了姑娘家的地址,自然就能根据地址找到姑娘。具体如何找到姑娘呢?这需要用到一个新的运算符*。
*称为解引用运算符(dereferencing operator),也称间接运算符*(indirection operator),用于获取指针指向的变量的值。它所表达的意思就是,根据它后面的内存地址(指针就是地址),找到那个地址里存的东西。
meizi = *ptr; // 找出ptr指向的变量的值,也就是girl的值
ptr = &girl; 加上meizi = *ptr;就相当于meizi = girl; 你能想明白吗?
找到了girl,你还可以对她做点什么,比如送她一束花:
*ptr = flower;
这个过程是这样的:你根据girl家的地址ptr找到了girl,然后送给girl一束flower。
四、指针的声明
像变量一样,要使用指针,需要先对其进行声明。
指针的声明方式与普通变量差不多,就是要多加一个*号,示例如下:
int *pi; // pi是指向int类型变量的指针
char *pc; // pc是指向char类型变量的指针
这个声明有几个要点需要说明一下:
1.声明指针的写法。
*号挨着谁都可以,上面的int *pi;还可以写成int* pi;或者int * pi;
2.声明的类型
前面的类型并不是指指针的类型,而是指针指向的变量的类型。指针本身就是一个整数(确切地说是一个无符号整数),并不需要专门指定类型,我们也用不着管它是什么类型。注意,虽然指针的值是整数,但并不能说指针的类型就是整型,因为一些处理整数的操作不能用来处理指针。例如,可以把两个整数相乘,但是不能把两个指针相乘。所以,指针实际上是一个新类型,不是整数类型。也正因为如此,C专门为指针提供了%p格式的转换说明。
那么为什么在声明指针时非要指明指针指向的变量的数据类型呢?
这是因为不同的变量类型占用的存储空间不同,比如int类型通常占用4个字节,而double类型占用8个字节。如果不指定类型,那在取变量的值和指针偏移运算时就可能出现错误。
(1)取变量的值。
如果只知道变量的地址,不知道变量的类型,就相当于你只知道从内存哪个位置取数据,但却不知道取多大块数据,自然就取不到想要的数据。
(2)指针偏移
指针偏移指的是加减运算,需要注意的是,加减的单位不是字节,而是指针所指向的数据类型的大小。例如,对于int *类型的指针,加1实际上是指针指向的内存地址增加了4个字节(假设整数占4个字节)。如果不指定类型,显然无法让指针偏移到正确的地址。
除了以上两个主要原因,指定指针指向变量的类型显然提高了代码的可读性。其他程序员在阅读代码时,可以更容易地理解指针所指向的数据类型及其用途。
除此之外,还能减少数据类型混淆错误。因为编译器提前知道了指针指向的数据类型,当你错误地把指针指向其他类型时,编译器就能给出错误提示。
比如下面的例子:
#include<stdio.h>
int main() {
int a = 5;
double b = 9.2;
int *ptr = &a; // 声明一个指向 int 类型的指针
*ptr = 10; // 通过指针修改 a 的值
ptr = &b; // 错误:将指向int型的指针指向了double型的变量
return 0;
}
编译器会给出类似下面的警告:
assignment to 'int *' from incompatible pointer type 'double *'
3.指针声明的本质含义
在声明指针时,*被称为“指针声明修饰符”,虽然叫了个新名,但和前面讲的解引用运算符本质上是一样的,都是获取指针指向的变量的值。比如int *p;的本质含义是这样的:取出指针p指向的变量的值,这个值是int类型的。也就是说,int * p;的意思是p是一个指针,*p是int类型。明白了这一点,指针的指针也就很好理解了,比如int **p;说的是取出指针p指向的变量(为方便说明,假设这个被取出来的变便为q)的值,这个值还是一个地址,然后再取出q指向的变量的值,这个最后取出来的值是int型,也就是**p是int型。
现在,你明白为什么要把指针的声明放到最后讲解了吧?
标签:先找,变量,指向,int,简介,girl,ptr,指针 From: https://blog.csdn.net/jjmhx/article/details/143624453