数组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"; 都是合法的。

ZJI-全场八折优惠,香港服务器 600元起,还有日本/美国/韩国服务器

月付/年付优惠码:zji  下物理服务器/VDS/虚拟主机空间订单八折终身优惠(长期有效)一、ZJI官网点击直达ZJI官方网站二、特惠香港日本服务器香港大埔:http://hkdb.speedtest.zji.net/香港葵湾:http://hkkw.speedtest.zji.net/日本大阪:http://jpsk.speedtest.zji.net/日本大阪一型 ...

MOACK:韩国服务器/双E5-2450L/8GB内存/1T硬盘/10M不限流量,$59.00/月

Moack怎么样?Moack(蘑菇主机)是一家成立于2016年的商家,据说是国人和韩国合资开办的主机商家,目前主要销售独立服务器,机房位于韩国MOACK机房,网络接入了kt/lg/kinx三条线路,目前到中国大陆的速度非常好,国内Ping值平均在45MS左右,而且商家的套餐比较便宜,针对国人有很多活动。不过目前如果购买机器如需现场处理,由于COVID-19越来越严重,MOACK办公楼里的人也被感染...

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

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

黑客培训为你推荐
电脑杀毒软件哪个好电脑用什么杀毒软件好?985和211哪个好想问问大学211和985有什么不同吗?传奇类手游哪个好什么传奇手游还不错的 不烧钱 比较耐玩点少儿英语哪个好少儿英语哪个比较好?游戏盒子哪个好游戏盒子哪个好?核芯显卡与独立显卡哪个好核心显卡和独立显卡哪个好车险哪个好汽车保险买哪个公司的好播放器哪个好哪个播放器比较好用考生个人空间登录湖南自考所有成绩查询怎么查dns服务器故障电脑dns服务器发生故障怎么解决
cn域名注册 二级域名申请 韩国俄罗斯 免费名片模板 轻博 500m空间 有益网络 免费申请网站 卡巴斯基免费试用 如何安装服务器系统 香港亚马逊 网站加速软件 lamp的音标 114dns shuangcheng reboot 连连支付 rewrite规则 冰盾ddos防火墙 国内免备案cdn 更多