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

#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指针将有风险,值将被截断。比如:

#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以内),就会出问题:

#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个元素为单位:

#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大小的方式进行访问,这样,编译器会给出警告,但能编译通过。

#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即可。

#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指针原理(18)-C指针基础相关推荐

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

    简单C指针 指向整数的指针,以及指针的指针 myhaspl@myhaspl:~ % vim test1.c#include <stdio.h>int main(void){int x;x= ...

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

    2.指向数组的指针 #include <stdio.h>int main(void){int i;char x[20]="0123456789ABCDEFGHIJ";f ...

  3. C指针原理(44)-汇编基础

    AT&T汇编语语言中的数据段与数据类型 .data段定义的数据元素保留在内存中能够被指令读取和写入; .rodata段定义的数据元素只读: .data与.rodata段的数据类型: .asci ...

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

    取自netbsd中的源码,检查运算溢出,用C语言实现,方法很精妙 /* hide bintime for _STANDALONE because this header is used for hpc ...

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

    指针本身也是一种变量,支持常用的运算.比如加.减 #include <stdio.h>int main(void){int i;char x[20]="0123456789ABC ...

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

    规范路径格式,win32(windows环境下,路径之间的各个目录分隔将"\"改为"/",用"/"分隔,这样的好处是在UNIX和WINDOW ...

  7. C指针原理(14)-C指针基础

    make与makefile make是一个工具程序(Utility software),经由读取叫做"makefile"的文件,自动化建构软件.它是一种转化文件形式的工具,转换的目 ...

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

    tcctok.h定义了C语言的词法分析的基本元素,主要定义了关键字. / keywords /DEF(TOK_INT, "int")DEF(TOK_VOID, "void ...

  9. C指针原理(19)-C指针基础

    不用下标,直接引用多维数组名时,多维数组名代表一个指针变量,这个指针变量指向是最后一维长度的数组的指针,假设x是一个2*5的数组,定义为: int x[2][5] 直接引用x,不使用任何下标,此时x代 ...

  10. C指针原理(43)-helloworld的C程序汇编剖析

    一.汇编基础 1.指令码与数据处理 当计算机处理应用程序运行指令码时,数据指针指示处理器如何在内存的数据区域寻找要处理的数据,这块区域也称为堆栈,指令码放在另外的指令区,此外,还有指令指针机制,当处理 ...

最新文章

  1. 使用MasterPage遇到的问题
  2. 动画狗奔跑gif图片_常用的GIF制作工具,自媒体人常用,你还不会做表情包
  3. Visual Studio 2008 中使用插件Extjs提示的方法
  4. Shell记录-Shell命令(其他)
  5. Ajax 实现在WebForm中拖动控件并即时在服务端保存状态数据 (Asp.net 2.0)(示例代码下载)...
  6. 佳明、杜斯曼集团等巨头遭勒索攻击;Emotet利用新技术实施攻击
  7. 人工智能发展中面临的问题有哪些?
  8. IPO | 经纬恒润登科创板,好赛道下隐患依然很突出
  9. python物理模拟.pdf_用Python物理建模的第一本书终于来啦
  10. 程序员该如何对付日常小病小痛?
  11. java 开发中相对路径的参照物是什么,参照路径的配置,以及相对路径前加不加(/)反斜杠区别
  12. Canonical标签的作用及使用方法
  13. Alignment--本地blast使用详解1-数据库序列检索下载及比对
  14. 用PS怎样把一个字体居中整个图片
  15. 操作系统基础教程——第六章课后答案
  16. eclipse的outline窗口_【Eclipse】使用指南(5)快捷 Outline 视图
  17. trs java_TRS Java应用开发接口概述
  18. cct省计算机等级有用吗,省计算机二级有用吗
  19. sql查询匹配数字开头或字母开头
  20. 项目管理的思路推进信息化

热门文章

  1. 浮点数运算的精度问题:以js语言为例
  2. mybatis 获得一个map的返回集合
  3. Scala, Groovy, Clojure, Jython, JRuby and Java ----我们的工作语言
  4. 去除表单元素的默认样式
  5. phpstudy sqlsrv v8.1_phpStudy
  6. centos 8 卸载anaconda_CentOS 7.8 (2003) 发布,附地址
  7. MYSQL数据库VALUES_MySQL数据库“十宗罪”(十大经典错误案例)
  8. AnimalTFDB 3.0:动物转录因子注释和预测的综合资源库
  9. 转载:socket通信基础
  10. Android(四)——View和ViewGroup