C语言指针最佳指导Word格式.docx

上传人:b****5 文档编号:21645376 上传时间:2023-01-31 格式:DOCX 页数:69 大小:85.44KB
下载 相关 举报
C语言指针最佳指导Word格式.docx_第1页
第1页 / 共69页
C语言指针最佳指导Word格式.docx_第2页
第2页 / 共69页
C语言指针最佳指导Word格式.docx_第3页
第3页 / 共69页
C语言指针最佳指导Word格式.docx_第4页
第4页 / 共69页
C语言指针最佳指导Word格式.docx_第5页
第5页 / 共69页
点击查看更多>>
下载资源
资源描述

C语言指针最佳指导Word格式.docx

《C语言指针最佳指导Word格式.docx》由会员分享,可在线阅读,更多相关《C语言指针最佳指导Word格式.docx(69页珍藏版)》请在冰豆网上搜索。

C语言指针最佳指导Word格式.docx

19:

59/个人分类:

脚本语言

对于众多人提出的c/c++中指针难学的问题做个总结:

_h,y)r8L_Ms0a12984751Testing软件测试网0]+Q2C_OP_e_U

  指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多练是不行的,下面是两个很经典的例子,很多书上都有,对于学习的重点在于理解*x和x的理解,他们并不相同,*x所表示的其实就是变量a本身,x表示的是变量a在内存中的地址,如果想明白可以输出观察cout<

<

*x"

|"

x;

,当定义了int*x;

后对x=&

a的理解的问题。

仔细阅读和联系下面的两个例子我想指针问题就不是难点了!

#include 

stdio.h>

51Testing软件测试网_X_t)v"

J2[C+__B

]2h&

[0v_Z_k�z_Y129847main() 

51Testing软件测试网*[3Z_t_P_z_pA_

51Testing软件测试网_Q_mr9V-m7n2i,{

int 

a,b;

/* 

定义a,b两个整形变量用于输入两个整数 

*/51Testing软件测试网_U&

S;

T:

]-w

B#X_m,~/@

*point_1,*point_2,*temp_point;

定义三个指针变量 

*/

_p_No7O_r_h_F_`6Bz2f129847scanf("

%d,%d"

&

a,&

b);

格式化输入a,b的值 

4f_k_~_o$gN129847point_1=&

a;

把指针变量point_1的值指向变量a的地址 

\4L"

s|.@5eP&

k129847point_2=&

b;

把指针变量point_2的值指向变量b的地址 

*/51Testing软件测试网h:

r_A_Lf

v

d

if 

(a<

b) 

51Testing软件测试网7A�E_B'

L!

G8w(s.\"

i/w

X

l-R_t9Y129847 

temp_point=point_1;

这里的temp_point是用于临时存储point_1的值也就是变量a的地址的 

_i8W7X+dJ6[4]129847 

point_1=point_2;

把point_2的值赋予point_1 

5m!

R-j5s#R\_B_Y129847 

point_2=temp_point;

51Testing软件测试网x!

t+p!

H&

q_W_k;

\_K

d7s

由于point_1的值已经改变无法找到,利用前面临时存储的也就是temp_point找回原point_1的值赋予point_2,打到把point_1和point_2值对换的目的*/

_o3k

v4P__b_LS129847} 

51Testing软件测试网_};

z_z_S(d_q

printf("

*point_1,*point_2);

利用*point_1和*point_2也就是分辨指向b和a的方法把值显示自爱屏幕上 

.D6\r"

s;

E2z�`129847} 

_s_])G_@,c$p129847 

_X1t$D0MU0n(p'

^_{_c;

]129847/* 

此题需要注意和了解是的此法并没有改变变量a,b的值只是利用指针变量分别存储a和b的地址,然后再把那两个指针变量的值对换一下其实就是存储在 

51Testing软件测试网)a_R;

__w_Q:

W_E:

J

指针变量里面a与b的地址对换,在利用*point_1和*point_2的方式把调换后的值显示出来这里的*point_1实际就是a,此中算法并非真的改变a,b的值,而是 

5F'

h5X_q5v#@*a4o2_129847利用指针进行地址交换达到大小排序的目的. 

51Testing软件测试网X8@u_V%B~

"

e'

y_I_|:

N_`5l12984751Testing软件测试网'

w_N.i_a�Kq_t_M|

51Testing软件测试网_X&

U_|:

fJ

A2h�~$x/A_M)Q_C129847main() 

h,Z_]SL)@_f"

v4p$k129847{ 

51Testing软件测试网_w9]2q_Y_\_m5F&

h!

z8?

*/51Testing软件测试网8\#a7m8S_oK!

q

*point_1,*point_2;

P

C&

g2^_I(Eb

Zz9t/D129847scanf("

_\_s_o_U;

Z%M:

z:

~129847point_1 

&

/w_M_S_d_z}.V'

m_T_i_q129847point_2 

*/51Testing软件测试网,S_K_L5Z!

\_D/?

compositor(point_1,point_2);

调用自定义的排序涵数,把a,b的地址传递给point_1和point_2 

w_|_`_K_@*O_p_s(?

129847printf("

a,b);

打印出a,b的值 

_d_a_P/w"

o[#w

?

129847} 

s_[1P_j_i

K

g129847 

_tG_R7e5I_h/K_m129847static 

compositor(p1,p2) 

_J0`8f_y3P)O_V!

z_k%T129847int 

*p1,*p2;

定义形式参数p1,p2为指针变量 

M'

t_f

G_d`_U129847{ 

_l_Y

{zP

N1e129847int 

temp;

建立临时存储变量 

_X(P3t9M3V_H:

R129847 

(*p1<

*p2) 

如果*p1<

p2,注意这里的*p1和*p2其实就是a和b 

*/51Testing软件测试网_H_~_i�}_o(O_z

51Testing软件测试网G_@_Y\1U_V_D

j

temp 

*p1;

利用变量temp用于临时存储*p1和就是a的值 

_A

Q_\8c_f___@6h129847 

*p1 

*p2;

将*p1的值也就是a的值换成*p2的值也就是b的值,等价于a=b 

;

a_R-h_?

_i%k.O_?

129847 

*p2 

将*p2的值也就是temp的值等价于b=temp 

3G_wd

CA)T129847 

_K_i"

j___Q129847} 

9o_}_N_|_\#p+M(e_@#B129847 

*n_A_D_l-S�X^_i;

|_`%e129847/* 

注意:

此题与上题不同的是,直接改变了a于b的值达到真实改变的目的 

*/

彻底搞定C指针:

指向指针的指针

2008-04-1817:

18:

09/个人分类:

c语言

指向另一指针的指针

一.回顾指针概念:

早在本系列第二篇中我就对指针的实质进行了阐述。

今天我们又要学习一个叫做指向另一指针地址的指针。

让我们先回顾一下指针的概念吧!

当我们程序如下申明变量:

shortinti;

chara;

shortint*pi;

程序会在内存某地址空间上为各变量开辟空间,如下图所示。

内存地址→6 

10 

11 

12 

13 

14 

15

-------------------------------------------------------------------------------------

… 

|shortinti|chara| 

|shortint*pi|

图中所示中可看出:

i变量在内存地址5的位置,占两个字节。

a变量在内存地址7的位置,占一个字节。

pi变量在内存地址9的位置,占两个字节。

(注:

pi是指针,我这里指针的宽度只有两个字节,32位系统是四个字节)

接下来如下赋值:

i=50;

pi=&

i;

经过上在两句的赋值,变量的内存映象如下:

14 

15

--------------------------------------------------------------------------------------

50 

看到没有:

短整型指针变量pi的值为6,它就是I变量的内存起始地址。

所以,这时当我们对*pi进行读写操作时,其实就是对i变量的读写操作。

如:

*pi=5;

//就是等价于I=5;

二.指针的地址与指向另一指针地址的指针

在上一节中,我们看到,指针变量本身与其它变量一样也是在某个内存地址中的,如pi的内存起始地址是10。

同样的,我们也可能让某个指针指向这个地址。

看下面代码:

shortint**ppi;

//这是一个指向指针的指针,注意有两个*号

ppi=pi

第一句:

——申明了一个指针变量ppi,这个ppi是用来存储(或称指向)一个shortint*类型指针变量的地址。

第二句:

pi那就是取pi的地址,ppi=pi就是把pi的地址赋给了ppi。

即将地址值10赋值给ppi。

如下图:

------------------------------------------------------------------------------------

|shortinti|chara| 

|shortint*pi|shortint**ppi|

从图中看出,指针变量ppi的内容就是指针变量pi的起始地址。

于是……

ppi的值是多少呢?

——10。

*ppi的值是多少呢?

——6,即pi的值。

**ppi的值是多少呢?

——50,即I的值,也是*pi的值。

呵呵!

不用我说太多了,我相信你应明白这种指针了吧!

三.一个应用实例

1.设计一个函数:

voidfind1(chararray[],charsearch,char*pi)

要求:

这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search里的字符。

如果找到,函数通过第三个参数(pa)返回值为array字符串中第一个找到的字符的地址。

如果没找到,则为pa为0。

设计:

依题意,实现代码如下。

voidfind1(chararray[],charsearch,char*pa)

{

inti;

for(i=0;

*(array+i)!

=0;

i++)

{

if(*(array+i)==search)

pa=array+i

break;

}

elseif(*(array+i)==0)

pa=0;

}

你觉得这个函数能实现所要求的功能吗?

调试:

我下面调用这个函数试试。

voidmain()

charstr[]={“afsdfsdfdf\0”};

//待查找的字符串

chara=’d’;

//设置要查找的字符

char*p=0;

//如果查找到后指针p将指向字符串中查找到的第一个字符的地址。

find1(str,a,p);

//调用函数以实现所要操作。

if(0==p)

printf(“没找到!

\n”);

//1.如果没找到则输出此句

else

printf(“找到了,p=%d”,p);

//如果找到则输出此句

分析:

上面代码,你认为会是输出什么呢?

运行试试。

唉!

怎么输出的是:

没有找到!

而不是:

找到了,……。

明明a值为’d’,而str字符串的第四个字符是’d’,应该找得到呀!

再看函数定义处:

看调用处:

依我在第五篇的分析方法,函数调用时会对每一个参数进行一个隐含的赋值操作。

整个调用如下:

array=str;

search=a;

pa=p;

//请注意:

以上三句是调用时隐含的动作。

哦!

参数pa与参数search的传递并没有什么不同,都是值传递嘛(小语:

地址传递其实就是地址值传递嘛)!

所以对形参变量pa值(当然值是一个地址值)的修改并不会改变实参变量p值,因此p的值并没有改变(即p的指向并没有被改变)。

(如果还有疑问,再看一看《函数参数的传递》了。

修正:

voidfind2(char[]array,charsearch,char**ppa)

*ppa=array+i

*ppa=0;

主函数的调用处改如下:

find2(str,a,&

p);

再分析:

这样调用函数时的整个操作变成如下:

ppa=&

p;

看明白了吗?

ppa指向指针p的地址。

对*ppa的修改就是对p值的修改。

下面看一下指向指针变量的指针变量怎样正确引用。

用指向指针的指针变量访问一维和二维数组。

#include<

stdlib.h>

main()

inta[3],b[2][2],*p1,*p2,**p3,i,j;

请输入一维数组的值:

\n"

);

for(i=0;

i<

3;

scanf("

%d"

a[i]);

/*一维数组的输入*/

请输入二维数组的值:

2;

for(j=0;

j<

j++)

b[i][j]);

/*二维数组输入*/

用指针输出一维数组:

for(p1=a,i=0;

i++) 

/*用指针输出一维数组*/

printf("

%4d"

*(p1+i));

用指向指针的指针变量输出一维数组

(1):

for(p1=a,p3=&

p1,i=0;

*(*p3+i));

/*用指向指针的指针变量输出一维数组*/

用指向指针的指针变量输出一维数组

(2):

for(p1=a;

p1-a<

p1++)/*用指向指针的指针变量输出一维数组*/

p3=&

p1;

**p3);

用指针输出二维数组:

/*用指针输出二维数组*/

p2=b[i];

for(intj=0;

*(p2+j));

用指向指针的指针变量输出二维数组

(1):

i++)/*用指向指针的指针变量输出二维数组*/

p2=b[i];

p2;

*(*p3+j));

利用指向指针的指针变量对二维字符数组的访问。

inti;

char*ptr;

staticcharc[][16]={"

clanguage"

"

fox"

computer"

homepage"

};

/*二维字符数组*/

staticchar*cp[]={c[0],c[1],c[2],c[3]};

/*指针数组*/

staticchar**cpp;

/*指向字符指针的指针变量*/

cpp=cp;

/*将指针数组的首地址传递给指向字符指针的指针变量*/

4;

i++)/*按行输出字符串*/

%s\n"

*cpp++);

-----------\n"

cpp=&

cp[i];

*cpp);

4

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1