数组:一段存储相同数据类型的连续的内存
数组的特性:在内存中的存储方式都是一维的
因为内存是线性唯一的
一维数组:
定义:
int a[5];
int n; int a[n];//在定义a[n],n 必须确定,且不能定义初始化 // int n =5; int a[n]={1,2,3,4,5}-----error
//n=5; int a[n]; n=6;
int a[]={1,3,5}//在定义时必须初始化 int a[];
//自学内容(了解):零长数组 int a[0];
初始化:
完全初始化;
int a[5]={1,2,3,4,5};
不完全初始化
int a[5]={1,2}------//其他未被初始化的内容,有编译器初始化为0
int a[5]={1,2,[4]=4};//其他未被初始化的内容,有编译器初始化为0
不初始化:
普通局部变量:里面的值是内存原有的,无法掌控的,----乱码 (局部变量使用之前,必须了解里面的值)
全局变量:有编译器初始化为0
使用:
只能单个使用,不能整体使用<赋值>
int a[5];
a[0],a[1]...
int b[5];
b = a;//error ........
-------------------
int a[5];
for(i=0;i
printf("a[%d]=%d\n",i,a[i]);
--------------------------------
for(i=0;i
printf("a[%d]=%d\n",i,a[i]);
}
--------------------------
sizeof-----宏
int a;
sizeof(a);-------//a 在内存中所占的宽度----4 bytes;
sizeof(int)-----//int 用此数据类型定义变量,该变量所占的内存宽度----4bytes
// sizeof(char )---1 byte
--------
int a[5];
sizeof(a);//数组在内存中所占的宽度----5*4 bytes
sizeof(a[0])//-----------------------4 bytes
/// sizeof(a)/sizeof(a[0])
//---------************************************************************************----------------------------
二维数组:(遵循一维数值的特性)
定义:
int a[2][3];
a[0][0];a[0][1];a[0][2];a[1][0];a[1][1];a[1][2];
a[0][0]; a[0][1]; a[0][2];
a[1][0]; a[1][1]; a[1][2];
int a[2][3];
int m,n; int a[m][n];//在定义a[m][n],m,n 必须确定,且不能定义初始化 // int n =2,m=3, int a[m][n]={1,2,3,4,5}-----error
int a[][3]={1,3,5,6}//在定义时必须初始化,必须对列数有明确的数值
初始化:
完全初始化;
int a[2][3]={1,2,3,4,5,6};
int a[2][3]={{1,2,3},{4,5,6}};
不完全初始化
int a[2][3]={1,2}------//其他未被初始化的内容,有编译器初始化为0
int a[2][3]={[0][1]=4,[1][1]=6};//其他未被初始化的内容,有编译器初始化为0
不初始化:
普通局部变量:里面的值是内存原有的,无法掌控的,----乱码 (局部变量使用之前,必须了解里面的值)
全局变量:有编译器初始化为0
使用:
只能单个使用,不能整体使用<赋值>
int a[2][3] ;
printf("%d",a);//不能把整个数组的内容打印出来,是错误的,人有些时候需要面对现实
a[m][n];//根据下标使用
for(i=0;i < m;i++){
for(j=0;j< n;j++){
printf("a[%d][%d]=%d\n",i,j,a[i][j]);
}
}
for(i=0;i < sizeof(a)/sizeof(a[0]);i++){
for(j=0;j< sizeof(a[0])/sizeof(a[0][0]);j++){
printf("a[%d][%d]=%d\n",i,j,a[i][j]);
}
}
//sizeof(a)-------整个二维的宽度-----bytes
//sizeof(a[0])----一行的宽度
//sizeof(a[0][0])----具体元素的宽度
//---------------------------------------------
(多维数组)三位数组同上:
定义:
int a[2][3][4]={{{1,2,3,4},{5,6,7,8},{,9....}},{{},{},{}}};//2*3*4
初始化:
使用:
int a[m][n][h]
for(i=0;i < sizeof(a)/sizeof(a[0]);i++){
for(j=0;j< sizeof(a[0])/sizeof(a[0][0]);j++){
for(k=0;j< sizeof(a[0][0]) / sizeof(a[0][0][0]);k++);
printf("a[%d][%d][%d]=%d\n",i,j,k,a[i][j][k]);
}
----------------------------------------------------------------------
// 字符数组:(具备一般数组的所有特性,还有它自己的特性)
定义:
char s[10];
char s[10]={'a','b','c'};
(***)char s[]="nihao";//------sizeof(s)---6 bytes---结束符'\0'
char s[]={'n','i'};//-----sizeof(s)---2 bytes---莫有结束符'\0'
char s[2][2]={'n','\0','i','\0'};
char s[2][2]={
"n",
"i",
}
初始化;
完全:
不完全:
char s[10]={0};
//memset(s,c,sizeof)------man memset
// void bzero(void *s, size_t n);
不初始化:
局部
全局
字符数组的操作:
单个,函数
strcpy//拷贝时包含了结束符,
char *strcpy(char *dest, const char *src);//容易造成越界访问
dest 内存宽度 不能小于 src的有效数据宽度
---strncpy <自学内容>
sprintf
char buf[100];
memset(buf,0,sizeof(buf));
sprintf(buf,"%d",123);//printf
puts(buf);
memset
memcpy//内存搬移函数
void *memcpy(void *dest, const void *src, size_t n);
strlen
//计算字符串有效长度,没有包括结束符\0
strlen(s);//从地址开始,遇到结束符停止计数,没有结束符就一直统计下去
总结:
// sizeof----与初始化没有关系
// strlen----与初始化赋值有关系,且是决定型的关系
strcmp// 字符串比较函数
// "abc" > "bcd" -----是比较的两个字符串的地址 char *s="nihao";
---strncmp <自学滴>
strcat//字符串连接
strcat(s1,s2)// s1的原结束符干掉,接着s2的内容,包括s2结束符
//越界的问题:
// 连接过后,不能超过s1的原有长度
//<自学---自觉>char *strncat(char *dest, const char *src, size_t n);
puts
/*
注意:
内存访问千万注意 访问的宽度-----很容同意造成访问越界*/
阅读(292) | 评论(0) | 转发(0) |