一,數組
1,數組的定義
#define MAX_SIZE 1000
int a[MAX_SIZE];
int a[MAX_SIZE][MAX_SIZE];可以省略行,但是不可以省略列
使用宏定義來確定數組的大小,易於移植
int a[]={1.2.3};此時數組的大小是sizeof(a) = 12;
2,將數組初始化為0
a[MAX_SIZE] = 0;
a[MAX_SIZE] [MAX_SIZE]= 0;
或者memeset(a,o,MAX_SIZE);
注:void *memset(void *s, int ch, size_t n);將s中前n個字節用ch
代替。
3,如何輸入輸出一維數組
一維整型數組輸入
int a[MAX_SIZE];
int *p = a; (*p = &a[0])
for(i = 0; i < MAX_SIZE;i++)
{
// scanf("%d",&a[i]);
//scanf("%d",a + i);
//scanf("%d",p++);
// scanf("%d",p + i);
// scanf("%d",&p[i]);
}
注意:這樣寫是錯的,scanf("%d",a++);因為數組名是常量,表示數組首元素的地址,常量是不可以修改的。
一維整型數組的輸出
for(i = 0; i < MAX_SIZE;i++)
{
//printf("%d",*(p + i));
//printf("%d",p[i]);
//printf("%d",*(p++));
//printf("%d",a[i]);
//printf("%d",*(a+i));
}
一維字符型數組輸入
char str[MAX_SIZE];
scanf("%s",str):用scanf輸入字符時,不能輸入空格,如果輸入空格,那麼會自動跳出scanf這個函數,停止輸入內容
gets(str):使用這個函數要加上頭文件#include<string.h>
getchar():這個函數每次只能輸入一個字符,所以可以用循環輸入
for(i = 0 ; i < MAX_SIZE;i++)
{
getchar();
}
一維字符型數組輸出
printf("%s",str):
puts(str);
4,關於一維數組和指針
舉例:
打印結果相同
因為兩者都表示數組的首元素地址
如果各自加1 。結果就不一樣了
&a:數組地址,用首元素的地址表示,代表整個整個數組在內存中的位置,所以&a+1,就是在首地址上加sizeof(a);
a是數組名,數組名表示的是指針常量,存放的是數組首元素的地址,因為是常量不可以對其進行修改,例如scanf("%d",a++);
對一維數組的數組名取地址 = 數組的地址
對一維數組的地址取值 = 數組元素的首地址 (*(&a) = a)
二維整型數組的輸入和輸出
int a[][2] = {1,2,3,4};
for(i = 0,i < 2; i++)
{
for(j = 0; j < 2;j++)
{
//scanf("%d",&a[i][j]);
//scanf("%d",*(a+i)+j);
}
}
for(i = 0,i < 2; i++)
{
for(j = 0; j < 2;j++)
{
//printf("%d",a[i][j]);
//printf("%d",*(*(a+i)+j));
}
}
二維字符數組
輸入
char *ptr[3][100]; //定義一個數組指針
char src[3][100];
for(i = 0; i < 3;i++)
{
//scanf("%s",src[i]);
//scanf("%s",*(src+i));
//scanf("%s",*ptr[i]);
}
輸出
for(i = 0; i < 3;i++)
{
//printf("%s\n",src[i]);
//printf("%s\n",*(src+i));
//printf("%s\n",*ptr[i]);
}
*(*(a+ i)+ j)
a+i:第i+1個一維數組的地址
*(a+i):第i+1個一維數組首元素的地址
*(a+i)+j:第i + 1個一維數組中的第j+1個元素的地址
*(*(a+ i)+ j):第i + 1個一維數組中的第j+1個元素的地址所指向的內存單元的值。
在輸出和輸入函數,可以用以上的一些指針表示地址