#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);//这一个就不会发生越界访问
}