C語言-數組小結

一、數組的概念

        數組是一組有序數據的集合,下標代表數據在數組中的序號;

       用一個數組名和下標來唯一確定數組中的元素,且每一個元素都屬於同一數據類型

        數組的創建方式:類型符 數組名[常量表達式 ][ ]……[ ];

二、數組的初始化

        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 *p1 = "asd";
    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   有\0 
  printf("%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   數組總大小,包括\0
  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  跳過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;
 }

            

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章