指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
type *var-name;
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。
NULL 指针是一个定义在标准库中的值为零的常量
可以对指针进行四种算术运算:++、--、+、-。
假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算:
ptr++
在执行完上述的运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节(一个整型变量占用4字节)。
如果 ptr 指向一个地址为 1000 的字符(char占用1个字节),上面的运算会导致指针指向位置 1001,因为下一个字符位置是在 1001。
#include <stdio.h>
int main(){
int age=20;//实际变量
int *p_age;//指针变量声明
p_age=&age;
printf("变量age的内存地址:%x\n",&age);
printf("p_age存储的地址:%x\n",p_age);
printf("指针p_age的值:%d\n",*p_age);
return 0;
}
变量age的内存地址:18ff44
p_age存储的地址:18ff44
指针p_age的值:20
指针数组:让数组存储指向 int 或 char 或其他数据类型的指针
#include <stdio.h>
const int MAX=3;
int main(){
int age[]={1,5,20};
int i,*p_age[MAX];
for(i=0;i<MAX;i++){
p_age[i]=&age[i];
}
for(i=0;i<MAX;i++){
printf("age[%d]的值:%d\n",i,*p_age[i]);
}
return 0;
}
age[0]的值:1
age[1]的值:5
age[2]的值:20
指针的指针:
指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置
#include <stdio.h>
int main(){
int age;
int *p_age;
int **pp_age;
age=100;
p_age=&age;//获取age的地址
pp_age=&p_age;//使用&获取p_age的地址
printf("age的值:%d\n",age);
printf("指针*p_age的值:%d\n",*p_age);
printf("指针**pp_age的值:%d\n",**pp_age);
}
age的值:100
指针*p_age的值:100
指针**pp_age的值:100