数组12 c语言多维数组的指针变量 - 中安网培 - 黑客培训,.

黑客培训  时间:2021-01-22  阅读:()

12 c语言多维数组的指针变量-中安网培-黑客培训安全培训门户网站

12 c语言多维数组的指针变量

12 c语言多维数组的指针变量

[作者佚名 |文章来源 hackervip(中安网络安全培训) | 点击数

|更新时间 2005-6-3 ]

[文字 变小变大]

多维数组的指针变量(1) 一、多维数组地址的表示方法 设有整型二维数组a[3] [4]如下 0 1 2 3 4 5 6 7 8 9 10 11 设数组a的首地址为1000各下标变量的首地址及其值如图所示。在前面曾经介绍过 C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组 即a[0]  a[1]  a[2] 。每一个一维数组又含有四个元素。例如a[0]数组含有a[0] [0]  a[0] [1]  a[0] [2]  a[0] [3]四个元素。数组及数组元素的地址表示如下 a是二维数组名也是二维数组0行的首地址等于1000。 a[0]是第一个一维数组的数组名和首地址 因此也为1000。

*(a+0)或*a是与a[0]等效的 它表示一维数组a[0]0号元素的首地址。 也为1000。 &a[0] [0]是二维数组a的0行0列元素首地址 同样是1000。因此a a[0]  *(a+0)  *a &a[0] [0]是相等的。 同理 a+1是二维数组1行的首地址等于1008。 a[1]是第二个一维数组的数组名和首地址 因此也为1008。&a[1] [0]是二维数组a的1行0列元素地址也是1008。因此a+1,a[1] ,*(a+1) ,&a[1] [0]是等同的。 由此可得出 a+i a[i]  *(a+i) &a[i] [0]是等同的。 此外 &a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址不存在元素a[i] 。 C语言规定它是一种地址计算方法表示数组a第i行首地址。 由此我们得出 a[i]  &a[i] 

*(a+i)和a+i也都是等同的。另外 a[0]也可以看成是a[0]+0是一维数组a[0]的0号元素的首地址 而a[0]+1则是a[0]的1号元素首地址 由此可得出a[i]+j则是一维数组a[i]的j号元素首地址它等于&a[i] [j] 。 由a[i]=*(a+i)得a[i]+j=*(a+i)+j 由于*(a+i)+j是二维数组a的i行j列元素的首地址。该元素的值等于*(*(a+i)+j) 。 [Explain]

#define PF "%d,%d,%d,%d,%d, \n"main() {static inta[3] [4]={0, 1,2,3,4,5,6,7,8,9, 10, 11} ;printf(PF,a,*a,a[0] ,&a[0] ,&a[0] [0]) ;printf(PF,a+1,*(a+1) ,a[1] ,&a[1] ,&a[1] [0]) ;printf(PF,a+2,*(a+2) ,a[2] ,&a[2] ,&a[2] [0]) ;printf("%d,%d\n",a[1]+1,*(a+1)+1) ;printf("%d,%d\n",

*(a[1]+1) ,*(*(a+1)+1) ) ; }多维数组的指针变量(2) 二、多维数组的指针变量 把二维数组a分解为一维数组a[0] ,a[1] ,a[2]之后设p为指向二维数组的指针变量。可定义为 int (*p) [4]它表示p是一个指针变量它指向二维数组a或指向第一个一维数组a[0] 其值等于a,a[0] 或&a[0] [0]等。而p+i则指向一维数组a[i] 。从前面的分析可得出*(p+i)+j是二维数组i行j列的元素的地址而*(*(p+i)+j)则是i行j列元素的值。二维数组指针变量说明的一般形式为 类型说明符(*指针变量名) [长度]其中“类型说明符”为所指数组的数据类型。 “*”表示其后的变量是指针类型。“长度”表示二维数组分解为多个一维数组时 一维数组的长度也就是二维

数组的列数。应注意“(*指针变量名)”两边的括号不可少如缺少括号则表示是指针数组(本章后面介绍) 意义就完全不同了。 [Explain]main() {static inta[3] [4]={0, 1,2,3,4,5,6,7,8,9, 10, 11} ; int(*p) [4] ; inti, j;p=a;for(i=0; i<3; i++)for(j=0;j<4;j++) printf("%2d ",*(*(p+i)+j) ) ; }

‘Expain字符串指针变量的说明和使用字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。 对指向字符变量的指针变量应赋予该字符变量的地址。如 char c,*p=&c;表示p是一个指向字符变量c的指针变量。而 char *s="C Language";则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。 请看下面一例。main() {char *ps;ps="C Language";printf("%s",ps) ; } 运行结果为C Language 上例中首先定义ps是一个字符指针变量 然后把字符串的首地址赋予ps(应写出整个字符串 以便编译系统把该串装入连续的一块内存单元) 并把首地址送入ps。程序中的 char *ps;ps="C Language";等效于 char *ps="C Language";输出字符串中n个字符后的所有字符。main() {char *ps="this is a book"; intn=10;ps=ps+n;printf("%s\n",ps) ; } 运行结果为 book在程序中对ps初始化时 即把字符串首地址赋予ps 当ps= ps+10之后 ps指向字符“b”  因此输出为"book"。main() {char st[20] ,*ps; int i ;printf("input astring:\n") ;ps=st;scanf("%s",ps) ;for(i=0;ps[i] != ‘\0 ‘ ; i++) if(ps[i]==

‘k ‘) {printf("there is a ‘k ‘ in thestring\n") ;break; } if(ps[i]== ‘\0 ‘) printf("There is no ‘k ‘ in thestring\n") ; } 本例是在输入的字符串中查找有无‘k’字符。 下面这个例子是将指针变量指向一个格式字符串用在printf函数中用于输出二维数组的各种地址表示的值。但在printf语句中用指针变量PF代替了格式串。 这也是程序中常用的方法。main() {static int a[3] [4]={0, 1,2,3,4,5,6,7,8,9, 10, 11} ;char

*PF;PF="%d,%d,%d,%d,%d\n";printf(PF,a,*a,a[0] ,&a[0] ,&a[0] [0]) ;printf(PF,a+1,*(a+1) ,a[1] ,&a[1] ,&a[1] [0]) ;printf(PF,a+2,*(a+2) ,a[2] ,&a[2] ,&a[2] [0]) ;printf("%d,%d\n",a[1]+1,*(a+1)+1) ;printf("%d,%d\n",*(a[1]+1) ,

*(*(a+1)+1) ) ; }多维数组的指针变量(3) 在下例是讲解把字符串指针作为函数参数的使用。要求把一个字符串的内容复制到另一个字符串中并且不能使用strcpy函数。函数cprstr的形参为两个字符指针变量。 pss指向源字符串 pds指向目标字符串。表达式

(*pds=*pss) !=' \0 ‘cpystr(char *pss,char

*pds) {while( (*pds=*pss) != ‘\0 ‘) {pds++;pss++; } }main() {char

*pa="CHINA",b[10] ,*pb;pb=b;cpystr(pa,pb) ;printf("string a=%s\nstringb=%s\n",pa,pb) ; } 在上例中程序完成了两项工作一是把pss指向的源字符复制到pds所指向的目标字符中二是判断所复制的字符是否为' \0 ‘ 若是则表明源字符串结束不再循环。否则 pds和pss都加1指向下一字符。在主函数中 以指针变量pa,pb为实参分别取得确定值后调用cprstr函数。由于采用的指针变量pa和pss,pb和pds均指向同一字符串 因此在主函数和cprstr函数中均可使用这些字符串。也可以把cprstr函数简化为以下形式

cprstr(char *pss,char*pds) {while ( (*pds++=*pss++) !=' \0 ‘) ; } 即把指针的移动和赋值合并在一个语句中。 进一步分析还可发现' \0 ‘的ASCⅡ码为0对于wh i l e语句只看表达式的值为非0就循环为0则结束循环 因此也可省去“!=' \0 ‘”这一判断部分而写为以下形式cprstr (char *pss,char *pds) {while (*pdss++=*pss++) ; } 表达式的意义可解释为源字符向目标字符赋值 移动指针若所赋值为非0则循环否则结束循环。这样使程序更加简洁。简化后的程序如下所示。cpystr(char *pss,char *pds) {while(*pds++=*pss++) ; }main() {char

*pa="CHINA",b[10] ,*pb;pb=b;cpystr(pa,pb) ;printf("string a=%s\nstringb=%s\n",pa,pb) ; } 使用字符串指针变量与字符数组的区别 用字符数组和字符指针变量都可实现字符串的存储和运算。 但是两者是有区别的。在使用时应注意以下几个问题 1.字符串指针变量本身是一个变量用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以 ‘\0’作为串的结束。字符数组是由于若干个数组元素组成的它可用来存放整个字符串。 2.对字符数组作初始化赋值必须采用外部类型或静态类型如 static char st[]={ “C Language” } ;而对字符串指针变量则无此限制如 char *ps="C Language"; 3.对字符串指针方式char

*ps="C Language";可以写为 char *ps; ps="C Language";而对数组方式static char st[]={"C Language"} ; 不能写为char st[20] ;st={"C Language"} ; 而只能对字符数组的各元素逐个赋值。 从以上几点可以看出字符串指针变量与字符数组在使用时的区别 同时也可看出使用指针变量更加方便。前面说过 当一个指针变量在未取得确定地址前使用是危险的容易引起错误。但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。因此char *ps="C Langage"; 或者char *ps;ps="C Language"; 都是合法的。

美国200G美国高防服务器16G,800元

美国高防服务器提速啦专业提供美国高防服务器,美国高防服务器租用,美国抗攻击服务器,高防御美国服务器租用等。我们的海外高防服务器带给您坚不可摧的DDoS防护,保障您的业务不受攻击影响。HostEase美国高防服务器位于加州和洛杉矶数据中心,均为国内访问速度最快最稳定的美国抗攻击机房,带给您快速的访问体验。我们的高防服务器配有最高层级的DDoS防护系统,每款抗攻击服务器均拥有免费DDoS防护额度,让您...

优林云(53元)哈尔滨电信2核2G

优林怎么样?优林好不好?优林 是一家国人VPS主机商,成立于2016年,主营国内外服务器产品。云服务器基于hyper-v和kvm虚拟架构,国内速度还不错。今天优林给我们带来促销的是国内东北地区哈尔滨云服务器!全部是独享带宽!首月5折 续费5折续费!地区CPU内存硬盘带宽价格购买哈尔滨电信2核2G50G1M53元直达链接哈尔滨电信4核4G50G1M83元直达链接哈尔滨电信8核8G50G1M131元直...

蓝竹云挂机宝25元/年,美国西雅图 1核1G 100M 20元

蓝竹云怎么样 蓝竹云好不好蓝竹云是新商家这次给我们带来的 挂机宝25元/年 美国西雅图云服务器 下面是套餐和评测,废话不说直接开干~~蓝竹云官网链接点击打开官网江西上饶挂机宝宿主机配置 2*E5 2696V2 384G 8*1500G SAS RAID10阵列支持Windows sever 2008,Windows sever 2012,Centos 7.6,Debian 10.3,Ubuntu1...

黑客培训为你推荐
骁龙750g和765g哪个好骁龙730G和骁龙835、联发科Helio G90T哪个更好?杀毒软件哪个好什么杀毒软件比较好呢??莫代尔和纯棉哪个好莫代尔好还是棉好莫代尔和纯棉哪个好请问莫代尔棉和纯莫代尔哪个更好?手动挡和自动挡哪个好自动挡手动挡哪个好?少儿英语哪个好少儿英语教材哪个好?手机音乐播放器哪个好手机音乐播放器哪个好杰士邦和杜蕾斯哪个好杜蕾斯好用还是杰士邦好要?雅思和托福哪个好考托福和雅思哪个好考 急。。。。。电动牙刷哪个好什么品牌的电动牙刷比较好?
已备案域名 北京租服务器 lamp 星星海 hawkhost paypal认证 ev证书 mysql主机 中国智能物流骨干网 共享主机 南通服务器 昆明蜗牛家 域名与空间 lamp架构 免费个人网页 apnic 优惠服务器 美国达拉斯 vim 更多