六、数组(例2---数组的访问)

#include <stdio.h>
#include <string.h>

int main()
{
   //如何获取数组具体元素的值和内存地址
   char array1[]={1,2,3,4,5};

   printf("%p==%p\narray1:%d *&array1[0]:%d array1[0]:%d\n",
             array1,&array1[0],*array1,*&array1[0],array1[0]);
   //*array1表示获取对应内存地址空间的内容

   printf("sizeof(array1):%d  sizeof(&array1[0]):%d sizeof(array1[0]):%d\n",sizeof(array1),sizeof(&array1[0]),sizeof(array1[0]));
   //一切保存内存地址值的空间,大小是4个字节。
   //sizeof(array1)在这里,array1不单表示地址值,还指待数组整体空间占用情况
   int i;for(i=0;i<5;i++)printf("%d ",array1[i]);printf("\n");

   for(i=0;i<10;i++)printf("%d ",array1[i]);printf("\n");//越界访问问题,不是所有的越界访问都会产生段错误,但是这样的访问是一个定时炸弹,你不会知道它什么时候爆发

   //字符数组的学习
   char str1[]="abc";//等价于{'a','b','c','\0'};//字符数组存的>    是一个字符串
   char str0[]={'a','b','c'};//字符数组存的只是一些字符序列
   printf("str0:%s \nstr1:%s\n",str0,str1);//直接打印字符数组容易引发越界访问,应规避这种行为   
   //以下是输出字符数组比较正规的方法:
   for(i=0;i<sizeof(str0)/sizeof(char);i++)printf("%c",str0[i]);
   printf("\n");
  
   //输入函数的学习:
   char c,tmp,array2[10];
   memset(array2,0,sizeof(array2)/*XX /sizeof(char)*/);
   //0代表'\0',memeset以字节为操作单位,与对象的数据类型无关
   int iCount=0,x;
   
   printf("\n请输入字符串,少于9个字符:");
   while(9>iCount&&(c=getchar())!='\n'){array2[iCount++]=c;
     // printf("%c ",c);fflush(stdout); //虽然能正常运行,但仍需要待用户触发终于输入机制的条件时才结束<换行,缓冲区满了>
   }
   //为何是9不是10,保留一个空间存放\0,防止整体输出时越界 <--考虑的是存放字符串的情况。
   //拓展知识:fread指定能接收的字符串长度的输入处理(man),FILE=stdin.

   for(x=iCount-1;x>=iCount/2;x--)//实现将字符串数组反序存放
   {//中间以4下标为支点,实现在一个数组中反序存放
     tmp=array2[x]; array2[x]=array2[iCount-1-x];//略去对'\0'的倒序     
     array2[iCount-1-x]=tmp;
   }
   printf("%s\n",array2);//这一个就不会发生越界访问
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值