C指针原理(18)-C指针基础

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C指针原理(18)-C指针基础相关的知识,希望对你有一定的参考价值。

5、指针数组

指针数组就是数组里存放的是指针。


#include?<stdio.h>

int?main(void){

????????int?i;

????????char?x[10]="ABCDEFGHIJ";

????????char?*p_x[10];

????????for?(i=0;i<10;i++){

????????????????p_x[i]=x+i;

???????????????//p_x[i]=&x[i];

????????}

????????for?(i=0;i<10;i++){

????????????????printf("%c?",*p_x[i]);

????????}

????????return?1;

}

上面定义了一个指针数组,数组的每个元素都是指针,每个指针指向x数组的相应元素。

其中,p_x为指针数组,通过for循环中的p_x[i]=x+i完成指针数组每个元素的赋值。这里也可以写成p_x[i]=&x[i]。最后以数组下标的方式访问数组,输出元素。

我们让这个程序更复杂一些,加入指针的指针。

定义pp_x,让它指向指针数组的第一个元素,然后向后移动指针,输出元素。源程序如下:

#include?<stdio.h>

int?main(void){

????????int?i;

????????char?x[10]="ABCDEFGHIJ";

????????char?*p_x[10];

????????for?(i=0;i<10;i++){

???????????????p_x[i]=x+i;

???????}

????????char?**pp_x=NULL;

????????for?(i=0;i<10;i++){

????????????????printf("%c?",*p_x[i]);

????????}

????????printf?("
");

????????for?(pp_x=p_x;pp_x<(p_x+10);pp_x++){

????????????????printf("%c???",**pp_x);

????????}

????????return?1;

}

运行程序

[email protected]:~?%?make

cc?test4.c?-o?mytest

[email protected]:~?%?./mytest

A?B?C?D?E?F?G?H?I?J?

A???B???C???D???E???F???G???H???I???J??

最后我们定义一个更复杂的例子,指针的指针的数组,名字有些长。在例子的最后代码使用了指向指针的指针的指针***ppp_x,用它来最后输出10个元素中的5个元素(每隔一个元素输出一个元素。类似的还使用temp_x,原理类似。

[email protected]:~?%?vim?test4.c


//code:[email protected]

#include?<stdio.h>

int?main(void){

????????int?i;

????????char?x[10]="ABCDEFGHIJ";

????????char?**pp_x[5];

????????char?*p_x[10];

????????for?(i=0;i<10;i++){

???????????????p_x[i]=x+i;

???????}

????????char?***temp_x=pp_x;

????????for?(i=0;i<10;i+=2){

????????????????*temp_x=&p_x[i];

????????????????temp_x++;

????????}

????????printf?("
");

????????char?***ppp_x;

????????for?(ppp_x=pp_x;ppp_x<(pp_x+5);ppp_x++){

????????????????printf("%c???",***ppp_x);

????????}

????????return?1;

????????运行程序

[email protected]:~?%?make?clean

rm?mytest

[email protected]:~?%?make

cc?test4.c?-o?mytest

[email protected]:~?%?./mytest

A???C???E???G???I???程序每隔一个元素对x数组的内容进行输出。

5、函数参数中使用指针

指针也是一种变量,其实,C语言的函数还是传值,所谓传址只是把指针值传给函数而已,本质上仍然是传值,如下面程序,交换两个数字

#include?<stdio.h>

int?main(void){

????????int?result;

????????int?x=50;

????????int?y=30;

????????myswap(&x,&y);

????????printf("x:%d-y:%d
",x,y);

}

int?myswap(int?*a,int?*b){

????????int?temp=*a;

????????*a=*b;

????????*b=temp;

}

~?????

运行后,X和Y的值交换了。

[email protected]:~?%?make?clean

rm?mytest

[email protected]:~?%?make

cc?test5.c?-o?mytest

[email protected]:~?%?./mytest

x:30-y:50

[email protected]:~?%?

我们定义一个数组,然后将数组指针做为参数进行传递。

下面是一段程序完成参数数组中所有元素之和。

#include?<stdio.h>

int?x[5]={1,2,3,4,5};

int?main(void){

????????int?result;

????????result=mysum(5,x);

????????printf("%d
",result);

}

int?mysum(int?length,int?*data){

????????int?myresult=0;

????????int?i;

????????for(i=0;i<length;i++){

????????????????myresult+=*(data+i);

????????}

????????return?myresult;

}

~???

运行结果如下:

[email protected]:~?%?make?clean

rm?mytest

[email protected]:~?%?make

cc?test6.c?-o?mytest

[email protected]:~?%?./mytest

15

[email protected]:~?%?

多维数组指针

指针是一个变量,它指向另一个变量的地址,指针本身的大小相同,但它指向变量的大小不一定相同,比如说char指针和int指针就不一样,32位系统中,char指针指向的变量仅有1字节,而int指针指向的变量有4个字节,这意味着将char指针指向int指针将有风险,值将被截断。比如:

//code:[email protected]

#include?<stdio.h>

int?main(void){

????????char?*i;

????????int?x=127;

????????i=(char*)&x;

????????printf("%d",*i);?

????????return?1;

}???????????

上面程序中当x值可用1个字节容纳时,程序运行正常。

[email protected]:~?%?./mytest

[email protected]:~?%?make

cc?test5.c?-o?mytest

[email protected]:~?%?./mytest

127

但当x值较大时(不在-128~127以内),就会出问题:

//code:[email protected]

#include?<stdio.h>

int?main(void){

????????char?*i;

????????int?x=250;

????????i=(char*)&x;

????????printf("%d",*i);?

????????return?1;

}??

[email protected]:~?%?make

cc?test5.c?-o?mytest

[email protected]:~?%?./mytest

-6m????

????

多维数组的指针定定义比一维数组更录活,因为它可以指定指向变量的最后一维的维数,下面定义的指针指向变量的大小是最后一维的5个元素,每次指针移动都以5个元素为单位:

//code:[email protected]

#include?<stdio.h>

int?main(void){

????????int?i;

????????int?x[2][5]={1,2,3,4,5,6,7,8,9,10};

????????int?(*p_x)[5];

????????for?(p_x=x;p_x<=(&x[1]);p_x++){

????????????????printf("%d???",*p_x[0]);?

????????}

????????return?1;

}??????

[email protected]:~?%?make

cc?test6.c?-o?mytest

[email protected]:~?%?./mytest

1???6?

下面定义的指针仅指向一个元素?,也通过改变指针指向变量的尺寸,将数组以5*2大小的方式进行访问,这样,编译器会给出警告,但能编译通过。

?//code:myha[email protected]

#include?<stdio.h>

int?main(void){

????????int?i;

????????int?x[2][5]={1,2,3,4,5,6,7,8,9,10};

????????int?(*p_x)[2];

????????for?(p_x=x;p_x<&x[1][5];p_x++){

????????????????printf("%d???",*p_x[0]);

????????}

????????return?1;

}

[email protected]:~?%?cc?test8.c?-o?mytest??????????????????????????????????????????

test8.c:?In?function?‘main‘:

test8.c:7:?warning:?assignment?from?incompatible?pointer?type

test8.c:7:?warning:?comparison?of?distinct?pointer?types?lacks?a?cast

[email protected]:~?%?./mytest

1???3???5???7???9???

并不赞成这种做法,如果需要每隔2个元素进行访问,可以将指针指向多维数组的一个元素,每次移动加上2即可。

//code:[email protected]

#include?<stdio.h>

int?main(void){

????????int?i;

????????int?x[2][5]={1,2,3,4,5,6,7,8,9,10};

????????int?*p_x=&x[0][0];

????????for?(;p_x<&x[1][5];p_x+=2){

????????????????printf("%d???",*p_x);

????????}

????????return?1;

}

[email protected]:~?%?cc?test7.c?-o?mytest??????????????????????????????????????????

[email protected]:~?%?./mytest

1???3???5???7???9 ?

以上是关于C指针原理(18)-C指针基础的主要内容,如果未能解决你的问题,请参考以下文章

C指针原理(15)-C指针基础

C指针原理(24)-C指针基础

C指针原理(16)-C指针基础

C指针原理(17)-C指针基础

C指针原理(13)-C指针基础

C指针原理(12)-C指针基础