根据出现的位置不同,操作符 * 既可以用来声明一个指针变量,也可以用作指针的取值。当用在声明一个变量时,*表示这里声明了一个指针。其它情况用到*表示指针的取值。
&是地址操作符,用来引用一个内存地址。通过在变量名字前使用&操作符,我们可以得到该变量的内存地址。
// 声明一个int指针
int*ptr
// 声明一个int值
int val = 1
// 为指针分配一个int值的引用
ptr = &val
// 对指针进行取值,打印存储在指针地址中的内容
int deref = *ptr
printf("%d\n", deref)
第2行,我们通过*操作符声明了一个int指针。接着我们声明了一个int变量并赋值为1。然后我们用int变量的地址初始化我们的int指针。接下来对int指针取值,用变量的内存地址初始化int指针。最终,我们打印输出变量值,内容为1。
第6行的&val是一个引用。在val变量声明并初始化内存之后,通过在变量名之前使用地址操作符&我们可以直接引用变量的内存地址。
第8行,我们再一次使用*操作符来对该指针取值,可直接获得指针指向的内存地址中的数据。由于指针声明的类型是int,所以取到的值是指针指向的内存地址存储的int值。
说穿了,指针就是地址吧,这里可以把指针、引用和值的关系类比为信封、邮箱地址和房子。一个指针就好像是一个信封,我们可以在上面填写邮寄地址。一个引用(地址)就像是一个邮件地址,它是实际的地址。取值就像是地址对应的房子。我们可以把信封上的地址擦掉,写上另外一个我们想要的地址,但这个行为对房子没有任何影响。
C语言是没有引用这个定义的,c++里面才有,它主要是带回作用,不过指针也可以起到带回作用,带回的是指针所指向的值而不是指针本身。像这种如果是保证F指向的值带回的话,可以不用引用。
就像C语言介绍的真交换一样,用指针就可以带回。
1. p=a //使int*指针p指向数组a的首元素,即a[0]的地址—&a[0]。2. 第一个for循环语句,就是通过指针p来对数组a的各个元素赋初值,*p的意思就是获取指针p所指向的内存单元的值,初始就是对a[0]赋初值i,*p++=i,等价于:
*p=i //对p指向的当前数组元素赋值,等价于a[i]=i
p++ //指针p自增1,使指针p指向下一个数组元素
当初始化数组a完成后,
3. p=a //使指针p重新指向数组a的首元素,即指向a[0]。
4. 第二个for循环,就是通过指针p输出数组a的所有元素到屏幕上了。
总结,通过指针来操作对象,是一种间接访问变量的方式,有很多的好处,这在以后的编程学习中你会慢慢体会到指针的妙处和精髓。