1.指针即地址
2.怎么获取变量的地址:取地址符号&
#include
int main(void){
//整型变量a,存放整型数据
int a = 10;
printf("%d\n",a);//输出a的值
printf("%d\n",&a);//以十进制的整数形式输出a的地址(指针)
printf("%x\n",&a);//以十六进制的形式输出a的地址(指针)
printf("%p\n",&a);//以十六进制的形式输出a的地址(指针)
return 0;
}
地址是个常量,不能被修改,且随机
C语言中数据类型与内存大小之间的关系:
#include
int main(void){
//变量的定义:类型名 变量名;
//定义了int型变量a,可以存放int型数据
int a;//int 是类型名,a是变量名
//定义了int型指针变量p
//p可以存放int型变量的指针
int *p;//int * 是类型名,p是变量名
int *b,c,*d;//b和d是指针变量,c是普通int型变量
//char ch = 100;
//p = &ch;//报错,p只能存放int型变量的地址
a = 10;//把10存放到a的内存块中
p = &a;//把a的地址存放到p的内存块中
//p = 100;//报错,不能将整型的值赋给指针变量型的实体,p只能存放地址数据,不能存放整型数据
return 0;
}
#include
int main(void){
int a = 0;
int b = 0;
int *p;
a = 10;
p = &a;//p存放a的地址,p指向a的内存块
printf("a的值:%d\n",a);//10
printf("a的地址:%d\n",&a);
printf("p的值:%d\n",p);//p里面存放的值就是a的地址
printf("p的地址:%d\n",&p);//p的地址
printf("*p的值:%d\n",*p);*p就是a,10
*p = 20;//间接访问a,相当于a = 20;a = 20为直接访问a
printf("a的值:%d\n",a);
printf("*p的值:%d\n",*p);
p = &b;//在此之前p存放的是a的地址,在这之后p存放了b的地址,即p指向了b的内存块
*p = 50;
printf("a的值:%d\n",a);
printf("b的值:%d\n",b);
printf("*p的值:%d\n",*p);
return 0;
}
*p:*后面跟的是哪个变量的地址,*p代表的就是哪个变量本身
#include
int main(void){
char ch = 0;
int a = 0;
float b = 0;
double d = 0;
char *p1 = &ch;
int *p2 = &a;
float *p3 = &b;
double *p4 = &d;
printf("%d\n",&ch);
printf("%d\n",&a);
printf("%d\n",&b);
printf("%d\n",&d);
printf("%d\n",&ch+1);//地址向后偏移了1个存储单元(1个字节)
printf("%d\n",&a+1);//地址向后偏移了1个存储单元(4个字节)
printf("%d\n",&b+1);//地址向后偏移了1个存储单元(4个字节)
printf("%d\n",&d+1);//地址向后偏移了1个存储单元(8个字节)
return 0;
}
#include
int main(void){
int a = 0;
int *p;
*p = 20;//错误,p是野指针,无法访问
printf("%d\n",a);
return 0;
}
#include
int main(void){
int a = 0;
int *p = NULL;//此时p为空指针,指针p并不是指向地址为0的存储单元,而是具有一个确定的值“空”
*p = 20;//错误,p是空指针,无法访问
printf("%d\n",a);
return 0;
}
#include
int main(void){
int a = 0;
int *p = NULL;
p = &a;
*p = 20;
{
int b = 30;
p = &b;
}
*p = 50;//p是野指针
printf("%d\n",a);
printf("%d\n",*p);
return 0;
}
#include
void fun(int *b);
int main(void){
int a = 10;
fun(&a);
printf("%d\n",a);
return 0;
}
void fun(int *b){
*b = 30;//相当于a = 30;间接的修改a的值
}
#include
void fun(int *x,int *y);
int main(void){
int a = 10;
int b = 20;
fun(&a,&b);
printf("%d\n",a);
printf("%d\n",b);
return 0;
}
//利用指针交换a和b的值
void fun(int *x,int *y){
int temp = 0;
temp = *x;
*x = *y;
*y = temp;
}