//***** 指针 *****
//***** 指针变量 *****
void test1()
{
int i = 100;
int *p = NULL;
p = &i;
printf("i:%d\n",*p);
/*
int *p 定义一个整形指针变量
p = &i 把i的地址赋给指针变量
指针就是存放别的变量的地址
*/
}
//***** 指针操作 *****
void test2()
{
int i = 100;
int *p = NULL;
p = &i;
*p = 101;
printf("i:%d\n",*p);
/*
*p 访问指针p指向的数值
*/
}
//***** 空指针 *****
void test3()
{
int *p;
p = NULL;
/*
p = NULL,NULL是一个宏,代表0,也就是该指针变量为0
指针是一个变量,那变量如何没有在定义时进行初始化,那系统就会给该指针变量一个随机值,所有我们必须指针变量赋为空
*/
}
//***** 指针变量更改 *****
void test4()
{
int a = 100;
int b = 200;
int *p = NULL;
p = &a;
printf("a:%d\n",*p);
p = &b;
printf("b:%d\n",*p);
int i = 300;
p = &i;
printf("p保存的地址:0x%p\n",p);
p ++;
printf("p保存的地址:0x%p\n",p);
p --;
printf("p保存的地址:0x%p\n",p);
p = p - 2;
printf("p保存的地址:0x%p\n",p);
/*
既然指针变量是一个变量,变量可以赋值,可以加减,可以比较大小,那指针变量也是可以的
p ++ 其实就是p + sizeof(int) * 1
p -- 其实就是p - sizeof(int) * 1
p = p - 2 其实就是p = p - siezeof(int) * 2
*/
}
//***** 指针自身地址 *****
void test5()
{
int a = 100;
int *p = NULL;
p = &a;
printf("p保存的地址:0x%p\n",p);
printf("p自身的地址:0x%p\n",&p);
printf("p指向的变量:%d\n",*p);
/*
指针既然存放的是别的地方的指针,但它自己也是存放在内存中的,那它自身也是有内存地址的
p一旦定义了,编译器就会自动在栈中开辟一块内存存放指针p
*/
}
//***** 指针类型 *****
void test6()
{
int a = 100;
int *p1 = NULL;
p1 = &a;
float b = 15.0f;
float *p2 = NULL;
p2 = &b;
printf("a:%d\n",*p1);
printf("b:%f\n",*p2);
/*
指针类型和指针指向的变量的类型是两个不同的概念,整形指针只能指向整形变量,浮点型指针只能指向浮点型变量
两者类型必须匹配
*/
}
//***** 常量指针const *****
void test7()
{
int a = 100;
int *const p = &a;
//p ++; // 由于指针是常量指针,假如p ++操作,将会出错
*p = 103; // 由于指针指向的数值不是常量,所以可以修改指向的数值的值
printf("p保存的地址:0x%p\n",p);
printf("p指向的数值:%d\n",*p);
/*
常量const指针,就是指针不可变,常量指针只能定义时初始化
*/
}
//***** 指向常量的指针 *****
void test8()
{
int a = 100;
const int *p = &a;
p ++; // 由于指针p不是常量指针,所以可以p ++
//*p = 103; // 由于指针p指向的数值是常量,所以不能更改指针p指向的常量
printf("p保存的地址:0x%p\n",p);
printf("p指向的数值:%d\n",*p);
/*
指针指向的是常量,所以指针指向的数值不可以改变
*/
}
//***** 指向常量的常指针 *****
void test9()
{
int a = 100;
const int *const p = &a;
//p ++; // 由于指针是常量指针,假如p ++操作,将会出错
//*p = 103; // 由于指针p指向的数值是常量,所以不能更改指针p指向的常量
printf("p保存的地址:0x%p\n",p);
printf("p指向的数值:%d\n",*p);
}
C语言_指针
最新推荐文章于 2022-05-06 22:11:55 发布