关于指针

# 关 于 指 针 关于指针


###首先,我们下来了解一下地址这个概念
####地址:C程序中的变量在内存中占有一个可表示的存储区,每一个存储区是有若干个字节组成,
####每一个字节都有自己的地址,而一个存储区的地址就是该存储区中第一个字节的地址
C这门语言允许在程序中使用变量的地址
( 通过地址运算符&可得到)
例如:
int x;则x的地址就是&x
*:解引用操作符
&:取地址操作


###之后,我们要知道指针是什么.
指针:一个变量的指针就是该变量的地址(指针就是地址)
指针变量:存放变量地址的变量,它用来指向另一个变量
%p可输出指针的值
就例如:

int a,*p1;
//注意: 指针变量是p1 , 不是*p1 (在变量定义时, * 号表示该变量是指针变量 ) 
a=233;
p1=&a;//这时p1就指向了a的地址(也可以理解为p1就是a的地址)
pritnf("%d\n",*p1);//*p1就是p1指向的地址上的值,输出p1指向的地址上的值,即a的值,即233
printf("%p\n",p1);//输出p1的值,即a的地址

###&*p -> &(p) -> &a
###
&a -> *(&a) -> p -> a
###注意:1、p与
p不同, p是指针变量, p的值是p所指向的变量的地址 *p 是p 所指向的变量 , *p的值是p所指向的变量的值
###2、引用指针变量时的 * 与 定义指针变量时的 * 定义变量时的 * 只是表示其后的变量是指针变量 (引用自指针某不知名指针ppt)


###下面我们来做一道例题:
(NOIP2015提高组阅读程序写结果第2题)

#include<iostream>
using namespace std;
void fun(char *a,char *b){
	a=b;
	(*a)++;
}
int main(){
	char c1,c2,*p1,*p2;
	c1='A';
	c2='a';
	p1=&c1;
	p2=&c2;
	fun(p1,p2);
	cout<<c1<<c2<<endl;
	return 0;
}
输出______

###解析:
这里定义的指针变量指向char类型(虽然不是指向int类型,但本质上还是一样的).
p1指向c1的地址;p2指向c2的地址;
那么我们不妨设c1的地址为1000,c2的地址为1001
则p1就是1000,p2就是1001
通过fun函数将两个两个指针变量p1,p2传入;
则fun中的a就指向了p1指向的地址(即c1的地址即1000),b就指向了c2的地址(即1001).
这时进行赋值语句a=b.那么a的值就变成了1000.
之后(*a)++,将a指向的地址上的值++,即将1001上的‘a’++,即将a变成b
调用fun函数后,1000上的值(即c1的值)还是’A’,而1001上的值(即c2的值)变成了‘b’.
(你可能会问p1与p2在调用fun函数前后是否改变了.实事证明它们并没有改变,因为函数中只是将形参a的值变成了b,而实参p1并没有改变(这样讲可以懂吗?ლ(╹◡╹ლ)),就是说只有函数中的a在函数中发生了改变,而外界并没有受到影响)

故输出为 Ab

###我们再来看一道例题:
(NOIP2014提高组单项选择题第11题)
有以下结构体说明和变量定义,如图所示,指针p,q,r分别指向一个链表中的三个续结点。现要将q和r所指结点的先后位置交换,同时要保持链表的连续,以下程序段中错误的是( ).
A. q->next = r->next; p-> next = r; r->next = q;
B. p->next = r; q->next = r->next; r->next = q;
C. q->next = r->next; r->next = q; p->next = r;
D. r->next = q; q->next = r->next; p->next = r;

我也不想多说了
注意几点:
在D中的第二条语句中q->next=r->next中的r->next已经发生了变化,已经变成了q,所以执行该语句后,
q->next=q而不是一开始时r-next

故答案为D


##**总结一下吧:**其实多模拟以下指针的过程,或是做做实验,敲敲代码,把你不懂的交给程序,在从程序输出的结果出发,思考为什么会这样.这样就能慢慢地理解了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值