C/C++知识点之C指针原理(18)-C指针基础
小标 2019-02-19 来源 : 阅读 603 评论 0

摘要:本文主要向大家介绍了 C/C++知识点之C指针原理(18)-C指针基础,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了 C/C++知识点之C指针原理(18)-C指针基础,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之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 ("\n");

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

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

        }

        return 1;

}


运行程序


myhaspl@myhaspl:~ % make

cc test4.c -o mytest

myhaspl@myhaspl:~ % ./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,原理类似。


myhaspl@myhaspl:~ % vim test4.c



//code:myhaspl@qq.com

#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 ("\n");

        char ***ppp_x;

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

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

        }

        return 1;


        运行程序


myhaspl@myhaspl:~ % make clean


rm mytest


myhaspl@myhaspl:~ % make


cc test4.c -o mytest


myhaspl@myhaspl:~ % ./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\n",x,y);

}

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

        int temp=*a;

        *a=*b;

        *b=temp;

}


~     


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


myhaspl@myhaspl:~ % make clean

rm mytest

myhaspl@myhaspl:~ % make

cc test5.c -o mytest

myhaspl@myhaspl:~ % ./mytest

x:30-y:50

myhaspl@myhaspl:~ % 


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


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


#include <stdio.h>

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

int main(void){

        int result;

        result=mysum(5,x);

        printf("%d\n",result);

}

int mysum(int length,int *data){

        int myresult=0;

        int i;

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

                myresult+=*(data+i);

        }

        return myresult;

}


~   


运行结果如下:


myhaspl@myhaspl:~ % make clean

rm mytest

myhaspl@myhaspl:~ % make

cc test6.c -o mytest

myhaspl@myhaspl:~ % ./mytest

15

myhaspl@myhaspl:~ % 


多维数组指针


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


//code:myhaspl@qq.com

#include <stdio.h>

int main(void){

        char *i;

        int x=127;

        i=(char*)&x;

        printf("%d",*i); 

        return 1;

}           


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


myhaspl@myhaspl:~ % ./mytest


127myhaspl@myhaspl:~ % make


cc test5.c -o mytest


myhaspl@myhaspl:~ % ./mytest


127


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


//code:myhaspl@qq.com

#include <stdio.h>

int main(void){

        char *i;

        int x=250;

        i=(char*)&x;

        printf("%d",*i); 

        return 1;

}  


myhaspl@myhaspl:~ % make


cc test5.c -o mytest


myhaspl@myhaspl:~ % ./mytest


-6m    


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


//code:myhaspl@qq.com

#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;

}      


myhaspl@myhaspl:~ % make


cc test6.c -o mytest


myhaspl@myhaspl:~ % ./mytest


1   6 


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


 //code:myhaspl@qq.com

#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;

}


myhaspl@myhaspl:~ % 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


myhaspl@myhaspl:~ % ./mytest


1   3   5   7   9   


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


//code:myhaspl@qq.com

#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;

}


myhaspl@myhaspl:~ % cc test7.c -o mytest                                          


myhaspl@myhaspl:~ % ./mytest


1   3   5   7   9  

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程