一维数组:
格式:类型说明符 数组名 【常量表达式】 ; 例如: int a 【10】;它表示定义了一个整形数组,数组名为a,有10个元素。
★:不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。
错误示例: 1、float a[0]; 数组大小为0没有意义
2、int b(2)(3); 不能使用圆括号
3、int k, a[k]; 不能用变量说明数组大小
★:未初始化的全局变量是0;
未初始化的局部变量是垃圾值,若对其中部分初始化,则其余全部为0。
取地址问题(%p):
&array【0】 //数组首元素地址,单位是4个字节。
array //数组名,同时也是首元素地址,单位是4个字节。
&array //数组地址,单位是一个数组,单位20个字节。
#include<stdio.h>
int b[5]; //未初始化的全局变量为0
int main()
{
// int array[5]; 未初始化的局部变量是垃圾值。
//int array[]={1, 2, 3, 4, 5};
int array[5]={1, 2, 3, 4, 5};
//int array[5] = {1, 2}; //若对局部变量的部分初始化,其余剩下的为0.
int i,j;
int a[4][3]={1, 2, 3, 4, 9, 8, 4, 7, 3, 1, 2, 0};
for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
{
printf("%d ",array[i]);
}
printf("\n");
for (i = 0; i < 5; i++)
{
printf("%d ",b[i]);
}
printf("\n");
printf("%p\n", &array[0]);
printf("%p\n", array);
printf("%p\n", &array);
printf("********\n");
printf("%p\n", &array[0]+1);
printf("%p\n", array+1);
printf("%p\n", &array+1);
printf("********\n");
for (i = 0; i < 4; i++)
{
for (j =0; j < 3; j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
二维数组:
格式:类型说明符 数组名 [常量表达式][常量表达式]; 例如:float a[3][4]; 它表示3行4列的float类型的数组。
取地址问题:
&a【0】【0】 //数组首元素地址,单位4字节
a【0】 //首行首元素地址,单位4字节
&a【0】 //首行的地址,单位12字节
a //首行的地址,单位12字节
&a //数组的地址,单位48字节
★:a【x】 ====== *(a+x)
例如:数组a【3】【4】,表示为a【1】【1】的。
1、*(a【1】+1):a【1】+1取地址,a【1】【1】,再加个*号就是取值的意思。
2、*(&a【1】【1】):&a【1】【1】取地址,*取值。
3、(*(a+1)【1】):*(a+1)== a【1】,所以取值a【1】【1】。
字符数组:
赋值问题:对于字符来说,以‘’赋值,例如:char a【10】={'a', 'b'};
对于字符串来说,以“”赋值,例如:char a【10】="helloworld";(字符串后占一位‘\0’,当作结束标志)
字符串处理函数:
1、strcat:连接函数
strcat (字符数组1 , 字符数组2)
char str1[30]={″People′s Republic of ″}; char str2[]={″China″}; printf(″%s″,strcat(str1,str2)); 输出: People′s Republic of China
2、strcpy:拷贝函数
strcpy (字符数组1, 字符数组2)
strncpy(字符数组1, 字符数组2,n):复制字符数组2中的前n位到字符数组1中
char str1[10],str2[]={″China″}; strcpy(str1,”china”);
★:复制时连同字符串后面的′\0′一起复制到字符数组1中
3、strcmp:字符串比较函数
strcmp(字符串1,字符串2):如果字符串1=字符串2,函数值为0; 如果字符串1>字符串2,函数值为一正整数; 如果字符串1<字符串2,函数值为一负整数。
strncmp(字符串1,字符串2, n):比较前n位字符。