一、數組的概念
數組是一組有序數據的集合,下標代表數據在數組中的序號;
用一個數組名和下標來唯一確定數組中的元素,且每一個元素都屬於同一數據類型;
數組的創建方式:類型符 數組名[常量表達式 ][ ]……[ ];
二、數組的初始化
1、一維數組:
int arr[m] //表示一個長度爲m的整型數組
//給全部數組元素賦初值
int arr1[5]={1,2,3,4,5};
//給部分數組元素賦初值,剩餘部分自動賦0
int arr2[5]={1,2,3};
//將數組元素全賦爲0
int arr3[5]={0}
//當數組元素個數確定且已賦值時可省略數組長度
int arr4[]={1,2,3,4,5} //確定該數組有5個元素
2、二維數組
float arr[3][4] //表示一個3行4列的浮點型數組
//分行賦初值
int arr1[2][3]={{1,2,3},{4,5,6}};
//輸入所有元素自動分行
int arr2[2][3]={1,2,3,4,5,6};
//可以部分元素賦初值,其他補0
int arr3[3][4]={{1},{2,3,4,5},{6,7,8,9}};
int arr4[3][4]={{1},{2,3,4}};
int arr4[3][4]={{1},{ },{2,3,4}};
//一維長度可以省,二維長度不可省
int arr[2][2]={1,2,3,4}等價於int arr[ ][2]={1,2,3,4}等價於int arr[ ][2]={{1,2},{ }};
3、字符數組
int arr1[] = { 'a','b','c' }; //'a' 'b' 'c'
int arr2[] = "abc"; //'a' 'b' 'c' '\0'
char *p = "abc"; //指針P開闢內存空間,指向abc地址
例題1:
int arr1[] = "asd";int arr2[] = "asd";
if (arr1 == arr2) //數組名代表數組首元素的地址
{
printf("hehe\n"); //將無法輸出,數組指向首元素
}
例題2:
char *p2 = "asd"; //指針指向所有字符的地址
if (p1 == p2)
{
printf("hehe\n"); //可以輸出
}
三、數組的應用及運算:
例題1:
//創建一個數組,
//實現函數init()初始化數組、
//實現empty()清空數組、
//實現reverse()函數完成數組元素的逆置。
//要求:自己設計函數的參數,返回值。
#include<stdio.h>
#include<stdlib.h>
void init(int* arr,int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
arr[i] = i;
printf("%d ", arr[i]);
}
printf("\n");
}
void empty(int* arr,int sz)
{
int j = 0;
for (j = sz-1; j >= 0; j--)
{
arr[j] -= j;
printf("%d ", arr[j]);
}
printf("\n");
}
int reverse(int* arr,int sz)
{
for (int k = sz - 1; k >= 0; k--)
{
printf("%d ", arr[k]);
}
printf("\n");
}
int main()
{
int a[10] = {0};
int size = sizeof(a) / sizeof(a[0]);
init(a, size);
reverse(a, size);
empty(a, size);
system("pause");
return 0;
}
例題2:
//寫一個函數實現冒泡排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz-1; i++)
{
int j = 0;
for (j = 0; j <sz-1-i; j++)
{
if (arr[j]>arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void print_arr(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
//實現冒泡排序:相鄰元素進行比較
int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
print_arr(arr, sz);
system("pause");
return 0;
}
例題3:strlen與sizeof的比較
int main()
{
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //16 sizeof(數組名)取整個數組printf("%d\n",sizeof(a+0)); //4 (數組名+i)表示第i個元素的地址,該爲首數組元素大小
printf("%d\n",sizeof(*a)); //4 首元素的解引用
printf("%d\n",sizeof(a+1)); //4 第二個元素
printf("%d\n",sizeof(a[1])); //4 第二個元素
printf("%d\n",sizeof(&a)); //4 取數組地址 //在VC6.0 編譯器下有bug--16
printf("%d\n",sizeof(*&a)); //16 數組地址的解引用爲整個數組
printf("%d\n",sizeof(&a+1)); //4 跳過數組的下一個元素
printf("%d\n",sizeof(&a[0])); //4 首元素的地址
printf("%d\n",sizeof(&a[0]+1)); //4 第二個元素的地址
字符數組
char arr[] = {'a','b','c','d','e','f'}
printf("%d\n", strlen(arr)); //隨機數x 數組裏面沒有/0,strlen無法停止
printf("%d\n", strlen(arr+0)); //x
//printf("%d\n", strlen(*arr)); //error錯誤 首元素的地址 即‘a’97,無法求長度 寫法錯誤
//printf("%d\n", strlen(arr[1])); //error錯誤
printf("%d\n", strlen(&arr)); //x
printf("%d\n", strlen(&arr+1)); //x-6 向後跳過數組
printf("%d\n", strlen(&arr[0]+1)); //x-1 過一個數組元素
printf("%d\n", sizeof(arr)); //6 整個數組
printf("%d\n", sizeof(arr+0)); //4 首元素地址
printf("%d\n", sizeof(*arr)); //1 字符指針的解引用
printf("%d\n", sizeof(arr[1])); //1 第二個元素
printf("%d\n", sizeof(&arr)); //4 數組的地址
printf("%d\n", sizeof(&arr+1)); //4 指向‘f’後數組的地址
printf("%d\n", sizeof(&arr[0]+1)); //4 第二個元素的地址
char arr[] = "abcdef";
printf("%d\n", strlen(arr)); //6 有\0printf("%d\n", strlen(arr+0)); //6
//printf("%d\n", strlen(*arr)); //error
//printf("%d\n", strlen(arr[1])); //error
printf("%d\n", strlen(&arr)); //6
printf("%d\n", strlen(&arr+1)); //隨機值x
printf("%d\n", strlen(&arr[0]+1)); //5
printf("%d\n", sizeof(arr)); //7 數組總大小,包括\0printf("%d\n", sizeof(arr+0)); //4 首元素的地址
printf("%d\n", sizeof(*arr)); //1 字符指針的解引用
printf("%d\n", sizeof(arr[1])); //1 首元素
printf("%d\n", sizeof(&arr)); //4
printf("%d\n", sizeof(&arr+1)); //4 跳過7個字符
printf("%d\n", sizeof(&arr[0]+1)); //4 第二個元素的地址
char *p = "abcdef";
printf("%d\n", strlen(p)); //6
printf("%d\n", strlen(p+1)); //5 從b向後數
//printf("%d\n", strlen(*p)); //error
//printf("%d\n", strlen(p[0])); //error
printf("%d\n", strlen(&p)); //隨機值x
printf("%d\n", strlen(&p+1)); //隨機值x
printf("%d\n", strlen(&p[0]+1)) //5 b向後數
printf("%d\n", sizeof(p)); //4 地址
printf("%d\n", sizeof(p+1)); //4 地址
printf("%d\n", sizeof(*p)); //
printf("%d\n", sizeof(p[0])); //1
printf("%d\n", sizeof(&p)); //4取p的地址
printf("%d\n", sizeof(&p+1)); //4
printf("%d\n", sizeof(&p[0]+1)); //4
二維數組
int a[3][4] = {0};
printf("%p\n", &a[0][0]);
printf("%p\n", a[0]+1);
printf("%d\n",sizeof(a)); //48 整個數組
printf("%d\n",sizeof(a[0][0])); //4 首元素
printf("%d\n",sizeof(a[0])); //16 第一行
printf("%d\n",sizeof(a[0]+1)); //4 地址,指向第一行第一個元素向後移一位
printf("%d\n",sizeof(a+1)); //4 地址,指向第二行的地址
printf("%d\n",sizeof(&a[0]+1)); //4 跳過第1行的地址
printf("%d\n",sizeof(*a)); //16 第一行的地址
printf("%d\n",sizeof(a[3])); //16 整個第四行的地址,sizeof中的表達式不參與運算
return 0;
}