计算机等级考试二级C语言(三)搞定C指针
2016-09-02 00:24
190 查看
一、指针是什么
int *pi;
pi
是一个指针,其实,它也只过是一个变量而已。与变量并没有实质的区别。
内存地址→
6 7 8 9 10 11 12 13
-------------------------------------------------------------------------------------------------------
··· | 30 | 't' | | | | |
···
-------------------------------------------------------------------------------------------------------
变量 | →
i
← |→
a ←| | →
pi
← |
内存地址→ 6 7 8 9 10 11 12 13
-------------------------------------------------------------------------------------------------------
··· | 30 | 't' | | | 6 | ···
-------------------------------------------------------------------------------------------------------
变量 | → i ← |→ a ←|
| → pi ← |
执行完
pi=&i 后,在图示中的内存中,
pi 的值是
6。这个
6 就是i
变量的地址编号,这样
pi 就指向了变量
i 了。
二、指针与数组名
<span style="font-size:18px;"></span><pre name="code" class="objc">
可以看出,这段代码也是将数组各元素值输出。不过,你把循环体{}中的
pa改成
a
试试。你会发现程序编译出错,不能成功。看来指针和数组名还是不同的。其实上面的指针是指针变量,而数组名只是一个指针常量。指针
pa
在整个循环中,其值是不断递增的,即指针值被修改了。数组名是指针常量,其值是不能修改的,因此不能类似这样操作:
a++。
三、const int *pi与int *const pi的区别
const int *pi (当然
int const *pi
也是一样的,它们实际是一样的)
pi
的值是可以被修改的。即它可以重新指向另一个地址的,但是,不能通过*pi
来修改
i2
的值。
首先
const 修饰的是整个*pi(注意,我写的是*pi
而不是 pi)。所以*pi
是常量,是不能被赋值的(虽然 pi
所指的 i2
是变量,不是常量)。
其次, pi
前并没有用 const
修饰,所以 pi 是指针变量,能被赋值重新指向另一内存地址的。
int *const pi
/* 代码开始 */
int i1 = 30;int i2 = 40;
int *const pi = &i1;
/* pi = &i2; 注意这里, pi 不能再这样重新赋值了,即不能再指向另一个新地址。(第 4 行的注释) */
/* 所以我已经注释了它。 */
i1 = 80; /* 想想看:这里能用 *pi = 80; 来代替吗?可以,这里可以通过*pi 修改 i1 的值。(第 5 行的注释) */
/* 请自行与前面一个例子比较。 */
printf("%d", *pi); /* 输出是 80 */
/* 代码结束 */
看了这段代码,你明白了什么?有没有发现 pi
值是不能重新赋值修改了。它只能永远指向初始化时的内存地址了。相反,这次你可以通过*pi
来修改
i1的值了。
1)
pi
因为有了 const
的修饰,所以只是一个指针常量:也就是说 pi
值是不可修改的(即
pi 不可以重新指向
i2 这个变量 了)(请看第
4 行的注释)。
2)整个*pi
的前面没有
const
的修饰。也就是说,
*pi
是变量而不是常量,所以我们可以通过*pi
来修改它所指内存
i1
的值 (请看第
5
行的注释)。
最后总结两句:
1) 如果 const 修饰在*pi 前,则不能改的是*pi(即不能类似这样:*pi=50;赋值)而不是指 pi。
2) 如果
const 是直接写在
pi 前,则
pi 不能改(即不能类似这样:pi=&i;赋值)。
四、指向另一指针的指针
int i=3;
int * pi;
pi=&i;
int ** ppi; //声明了一个指针变量
ppi,这个
ppi是用来存储(或称指向)一个
int * 类型指针变量的地址。
ppi=π //&pi
那就是取
pi 的地址,就是把
pi
的地址赋给了
ppi。
未完 待续 >>>>>>>>>>>>>>>
int *pi;
pi
是一个指针,其实,它也只过是一个变量而已。与变量并没有实质的区别。
内存地址→
6 7 8 9 10 11 12 13
-------------------------------------------------------------------------------------------------------
··· | 30 | 't' | | | | |
···
-------------------------------------------------------------------------------------------------------
变量 | →
i
← |→
a ←| | →
pi
← |
<span style="font-size:18px;"> pi=&i;</span>
内存地址→ 6 7 8 9 10 11 12 13
-------------------------------------------------------------------------------------------------------
··· | 30 | 't' | | | 6 | ···
-------------------------------------------------------------------------------------------------------
变量 | → i ← |→ a ←|
| → pi ← |
执行完
pi=&i 后,在图示中的内存中,
pi 的值是
6。这个
6 就是i
变量的地址编号,这样
pi 就指向了变量
i 了。
二、指针与数组名
<span style="font-size:18px;"></span><pre name="code" class="objc">
int i, *pa, a[] = {3,4,5,6,7,3,7,4,4,6}; pa = a; for (i = 0; i <= 9; i++) { printf("%d\n", *pa); pa++; /*注意这里,指针值被修改*/ }
可以看出,这段代码也是将数组各元素值输出。不过,你把循环体{}中的
pa改成
a
试试。你会发现程序编译出错,不能成功。看来指针和数组名还是不同的。其实上面的指针是指针变量,而数组名只是一个指针常量。指针
pa
在整个循环中,其值是不断递增的,即指针值被修改了。数组名是指针常量,其值是不能修改的,因此不能类似这样操作:
a++。
三、const int *pi与int *const pi的区别
const int *pi (当然
int const *pi
也是一样的,它们实际是一样的)
<span style="font-size:18px;">/* 代码开始 */ int i1 = f0c4 30; int i2 = 40; const int *pi = &i1; pi = &i2; /* 注意这里, pi 可以在任意时候重新赋值一个新内存地 址*/ i2 = 80; /* 想想看:这里能用*pi = 80 来代替吗?当然不能! */ printf("%d\n", *pi); /* 输出是 80 */ /* 代码结束 */</span>
pi
的值是可以被修改的。即它可以重新指向另一个地址的,但是,不能通过*pi
来修改
i2
的值。
首先
const 修饰的是整个*pi(注意,我写的是*pi
而不是 pi)。所以*pi
是常量,是不能被赋值的(虽然 pi
所指的 i2
是变量,不是常量)。
其次, pi
前并没有用 const
修饰,所以 pi 是指针变量,能被赋值重新指向另一内存地址的。
int *const pi
/* 代码开始 */
int i1 = 30;int i2 = 40;
int *const pi = &i1;
/* pi = &i2; 注意这里, pi 不能再这样重新赋值了,即不能再指向另一个新地址。(第 4 行的注释) */
/* 所以我已经注释了它。 */
i1 = 80; /* 想想看:这里能用 *pi = 80; 来代替吗?可以,这里可以通过*pi 修改 i1 的值。(第 5 行的注释) */
/* 请自行与前面一个例子比较。 */
printf("%d", *pi); /* 输出是 80 */
/* 代码结束 */
看了这段代码,你明白了什么?有没有发现 pi
值是不能重新赋值修改了。它只能永远指向初始化时的内存地址了。相反,这次你可以通过*pi
来修改
i1的值了。
1)
pi
因为有了 const
的修饰,所以只是一个指针常量:也就是说 pi
值是不可修改的(即
pi 不可以重新指向
i2 这个变量 了)(请看第
4 行的注释)。
2)整个*pi
的前面没有
const
的修饰。也就是说,
*pi
是变量而不是常量,所以我们可以通过*pi
来修改它所指内存
i1
的值 (请看第
5
行的注释)。
最后总结两句:
1) 如果 const 修饰在*pi 前,则不能改的是*pi(即不能类似这样:*pi=50;赋值)而不是指 pi。
2) 如果
const 是直接写在
pi 前,则
pi 不能改(即不能类似这样:pi=&i;赋值)。
四、指向另一指针的指针
int i=3;
int * pi;
pi=&i;
int ** ppi; //声明了一个指针变量
ppi,这个
ppi是用来存储(或称指向)一个
int * 类型指针变量的地址。
ppi=π //&pi
那就是取
pi 的地址,就是把
pi
的地址赋给了
ppi。
未完 待续 >>>>>>>>>>>>>>>
相关文章推荐
- 计算机等级考试--二级C语言1
- 计算机等级考试--二级C语言3
- 计算机等级二级C语言上机考试改错题分析总结
- 计算机等级考试2008年9月二级C语言真题(附答案)
- 江苏省计算机等级考试二级C语言笔试教程(1~6章)
- 计算机等级考试二级C语言(一)数据类型及其运算
- 05年9月等级考试二级C语言考前上机密卷_计算机等级真题
- 计算机等级考试上机模拟题(二级C语言)_等级考试模拟题,计算机等级考试,计算机考试
- 计算机等级考试--二级C语言2
- 2008全国计算机等级考试调整方案
- 计算机等级二级c语言历年上机真题第一套
- 计算机等级考试中的c语言程序
- 计算机等级考试相关 新大纲上半年实施
- 计算机等级考试评分系统
- 2012下半年版无忧全国计算机等级考试超级模拟软件DVD合集三级PC技术部分上机练习第33套题汇编运行结果
- 全国计算机等级考试评卷、成绩处理和证书管理办法
- 2008年起全国计算机等级考试科目及考核内容等方面调整
- 计算机等级考试二级C语言超级经典400道题目(8)
- 2007年9月全国计算机等级考试三级信息管理笔试试卷含参考答案
- 【解惑】计算机等级考试之类的认证有没有用?