全国咨询/投诉热线:400-618-4000

c/c++培训C语言核心知识总结(三、四)

更新时间:2016年10月21日16时32分 来源:传智播客C++培训学院 浏览次数:

三、一级指针
1. 指针的使用: 32位系统下是 4 个字节,64位系统下是 8 个字节
 
1) 在定义的时候用 * 号,代表这个变量那个是指针类型
int a = 10; // 定义一个整型变量,存储整数 10
int *p = &a; // 定义一个整型指针变量,存储a的地址
 
2) 在配合表达式使用 * 号,代表取值运算符,可以取出这个地址里的值
printf("%d\n", *p); // 打印p指向的地址里的值
printf("%d\n", *(&a)); // 打印a这个地址里的值
printf("%d\n", *p + 1); // 取出值,再加1打印出来
 
 
2. 指针的几种特殊定义方式:

1) int * const p;
指针常量:p 是 int*类型,那么const修饰的是p,所以p是常量,表示p指向的地址不可修改,
也就是说,p不能再指向别的地方了,但是可以修改p指向的这个地址里的值。
举例:
int a = 10;
int b = 20;
int * const p = &a;
p = &b; // 错误
*p = 100; // 允许
 
2)  const int *p;
int const *p;
常量指针:p 是 int*类型,那么const修饰的是*p,所以*p是常量,表示p指向的地址里的值不可修改,
也就是说,p里的值不能再重新赋值了,但是可以修改p指向的地址。
int a = 10;
int b = 20;
const int *p = &a;
p = &b; // 可以
*p = 100; // 错误
 
3) const int * const p;
常量指针常量:p 是 int*类型,那么const分别修饰了p 和 *p, 所以p和*p都是常量,表示p指向的地址不可修改,
同时p指向的地址里的值也不可修改。
int a = 10;
int b = 20;
const int *const p = &a;
p = &b; // 错误
*p = 100; // 错误
 
《C Primer Plus》 : "自由的代价,是永远的警惕。"
你定义了一个指针,那就一定要知道这个指针指向的什么地方,而且你要保证这个指针是真实有效的,否则我就用程序崩溃来惩罚你。
 
 
四、多级指针
 
#include <stdio.h>
int main(void)
{
int a = 10;
int *p = &a; // 定义一个一级指针变量,存储了整型变量a的地址
int **pp = &p; // 定义一个二级指针变量,存储了整型一级指针变量p的地址
int ***ppp = &pp; // 定义了一个三级指针变量,存储了整型二级指针变量pp的地址
 
printf("%p, %p, %p, %p\n", &a, &p, &pp, &ppp);
// 分别打印各个变量自身所在的内存地址
 
printf("%p, %p, %p, %p\n", &a, p, pp, ppp);
//printf("%d", a);  用%d的形式打印a的值:整数
//printf("%p", p);  用%p的形式打印p的值:地址
// &a : 打印 变量 a 的地址
// p: 打印变量 a的地址
// pp: 打印变量 p 的地址
// PPP:打印变量 pp 的地址
 
printf("%p, %p, %p, %p\n", &a, p, *pp, **ppp);
// &a : 打印 变量 a 的地址
// p: 打印变量 a 的地址
// *pp:打印变量 a 的地址
//**PPP: 打印变量 a 的地址
 
printf("%d, %d, %d, %d\n", a, *p, **pp, ***ppp);
// a: 打印 10
// *P: 打印 10
// **pp:打印 10
// ***ppp: 打印 10
}
本文版权归传智播客C++培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客C/C++培训学院
首发:http://www.itcast.cn/c/