2019.1.26 - 2019.1.28 數組

1.一維數組

#include <stdio.h>

//int a[10];                                       //未初始化的全局變量是0

int main()
{
#if 0
    int a[10];                                     //定義有10個整型元素的數組,在內存裏面連續存儲
    //int a[0];                                    //錯誤
    int k;
    //int b[k] = {0};                              //數組的長度一定是確定的
#endif

//數組的初始化操作
    //int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  //對所有元素初始化
    //int a[10];                                    //沒有初始化,未初始化的局部變量是垃圾值
    //int a[10] = {1, 2, 3};                        //對部分元素初始化,沒有初始化的元素變成0
    //int a[] = {1, 2, 3, 4, 5, 6 ,8, 8};           //可以不指定數組長度,但是一定要初始化
    int a[10] = {0};                                //所有元素初始化成0
    
    //printf("%d\n", a);  //不能直接輸出整型數組
    int i;
    for (i = 0; i < sizeof(a) / sizeof(int); i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");

    printf("%p\n", &a[0]);
    printf("%p\n", a);   //a表示數組首元素地址,和&a[0]意義一樣
    printf("%p\n", &a);  //&a表示數組的地址

    printf("*********\n");
    printf("%p\n", &a[0] + 1);
    printf("%p\n", a + 1);
    printf("%p\n", &a + 1);

    return 0;
}
 

2.二維數組

#include <stdio.h>

int main()
{
    int i, j;
    //int a[3][4];                 //三行四列的二維數組
    //int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};   //對所有元素初始化
    //int a[3][4] = {1, 2, 3, 4, 5}; //對部分元素初始化
    //int a[][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    int a[3][4] = {0};           //整個數組初始化成0

    for (i = 0; i < 3; i++)      //行循環
    {
        for (j = 0; j < 4; j++)  //列循環
        {
            printf("%d ", a[i][j]);
        }
        printf("\n");            //每行結束打印換行
    }

    printf("%p\n", &a[0][0]);     //第一個元素的地址
    printf("%p\n", a);            //數組名
    printf("%p\n", &a);
    printf("%p\n", a[0]);
    printf("%p\n", &a[0]);
    printf("*************************\n");
    printf("%p\n", &a[0][0] + 1);     //第一個元素的地址,單位是一個元素,四個字節
    printf("%p\n", a + 1);            //數組名,數組首行地址,單位是一行
    printf("%p\n", &a + 1);           //數組的地址,單位是一個數組
    printf("%p\n", a[0] + 1);         //數組首行首元素地址,單位是一個元素
    printf("%p\n", &a[0] + 1);        //數組首行地址

    /*
    &a      數組地址
    *(&a)   數組首行地址

    a       數組首行地址
    *a      數組首行元素地址


    */

    return 0;
}
 

3.字符數組

#include <stdio.h>

int main()
{
    int i;
    //char a[10] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'};
    char b[15] = "helloworld";

    /*char c[15];
    c = "helloworld";*/

    /*for (i = 0; i < 10; i++)
    {
        printf("%c", a[i]);
    }
    printf("\n");*/
    printf("%s\n", b);  //遇到'\0'結束

    return 0;
}
 

4.字符串處理函數

#include <stdio.h>
#include <string.h>

int main()
{
    char a[32] = {0};                //初始化字符數組  char a[32] = {'\0'};
    char b[32] = "hellwoorld";    
    char c[32] = "123451234512345";

    /*char d[32];   //d是數組名 是數組首元素低地址 是常指針
    d = "helloworld";
    d[32] = "helloworld";*/

    //strcpy(a, b);  //字符串拷貝函數,把數組b中的字符串拷貝到數組a中
    //strcpy(c, b);  //包括'\0',所以是全部覆蓋
    //strcpy(a, "helloworld");
    //printf("%s\n", a);
    //printf("%s\n", c);

    //strcat(b, c);  //字符串連接函數 把字符串c連接到字符串b後面
    //strcat(b, "111111");
    //strcat("11111", b);   //錯誤
    //printf("%s\n", b);

    if (strcmp(b, c) > 0)    //字符串比較函數 返回值 b>c 返回值大於0, b==c 返回值等於0 b<c 返回值小於0
    {
        printf("b > c\n");
    }

    if (strcmp(b, "helloworld") > 0)
    {
        printf("b > hello\n");
    }

    return 0;
}

5.自定義函數

#include <stdio.h>

void swap(int *x, int *y);  //函數聲明,如果函數定義 在 函數調用 的下面

void print()   //函數類型void 表示沒有返回值   沒有形參
{
    printf("helloworld!\n");  //函數體
}

int add(int x, int y)  //x和y 形參(形式參數)  實參和形參個數相同、類型相同、順序相同、名字可以不同 
{                      //2、給形參分配空間(棧空間)  3、傳參(值傳遞、地址傳遞)
    //return x + y;
    int sum;           //4、執行函數體

    sum = x + y;

    return sum;   //返回結果    //5、返回
}                               //6、釋放空間(棧空間)!!!!!

int main()
{
    int a = 1, b = 2;
    int result;

    print();                   //1、通過函數名找到函數入口地址
    result = add(a, b);        //a和b 實參(實際參數) 實參不要加類型
    printf("%d\n", result);
    printf("%d\n", add(a, b));
    printf("%p\n", add);       //函數名也是地址

    swap(&a, &b);   //當涉及修改實參值得時候,需要傳地址
    printf("a = %d b = %d\n", a, b);

    return 0;
}

void swap(int *x, int *y)
{
    int tmp = *x;
    *x = *y;
    *y = tmp;
}

6.宏函數

#include <stdio.h>

#define OUT   printf("helloworld\n")    //無參宏函數
#define P(s)  printf("%s\n", s)         //有參宏函數
#define SQR(x)  (x) * (x)               //宏函數只是簡單的替換,注意優先級

/*
宏函數的優點:
1、節省空間(不需要給形參分配空間)
2、執行效率高(不需要根據地址找到函數的入口)

宏函數的缺點:
1、編譯效率低(第一步預處理需要替換)
2、不安全,只是簡單的替換,沒有語法檢查
*/

int main()
{
    int a = 1, b = 2;
    OUT;
    P("12345");
    printf("%d\n", SQR(a + b));   //1 + 2 * 1 + 2

    return 0;
}
 

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