指針、進程空間、字符串

1、指針(續)

指針做函數參數,可以實現地址傳遞
//寫一個函數,將主函數中的變量a、b的值進行交換
void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

int fc(int *x)
{
    *x = 100;
    return 200;
}
        int a = 10;
        int b = 20;
        NSLog(@"a=%d,b=%d", a, b);
        swap(&a, &b);
        NSLog(@"a=%d,b=%d", a, b);

        x = 0;
        int y = fc(&x);
        NSLog(@"x=%d,y=%d", x, y);
指針作爲函數返回值的類型
#import <Foundation/Foundation.h>

int* add(int *x)
{
    *x += 10;
    return x;
}

int* get1()
{
    int x = 12345;
    return &x;//返回一個局部變量的地址時,該局部變量會被釋放,從而造成返回的地址變成無效地址
}

void get2()
{
    int y = 54321;
}

int* get3()
{
    static int x = 55555;
    return &x;
}

int main()
{
    @autoreleasepool {
        int a = 0;
        int *p1 = add(&a);
        NSLog(@"%d", *p1);

        p1 = get1();
        get2();
        NSLog(@"%d", *p1);

        p1 = get3();
        get2();
        NSLog(@"%d", *p1);
    }
    return 0;
}
指針加減
#import <Foundation/Foundation.h>

int main()
{
    @autoreleasepool {
        int a[5] = {10,20,30,40,50};

        int* p1 = &a[0];
        NSLog(@"%d", *p1);
        NSLog(@"%d", *(p1 + 1));
        NSLog(@"%d", *(p1 + 3));
        p1++;
        NSLog(@"%d", *p1);

        int* p2 = &a[4];
        NSLog(@"%d", *p2);
        NSLog(@"%d", *(p2 - 1));
        NSLog(@"%d", *(p2 - 3));
        p2--;
        NSLog(@"%d", *p2);

        int x = 100;//指針加減只能與數組配合使用,不能用於單個變量
        p1 = &x;

        p1 = &a[0];
        int f = *(p1++);
        NSLog(@"f=%d,*p1=%d", f, *p1);
        f = *(++p1);
        NSLog(@"f=%d,*p1=%d", f, *p1);
        f = (*p1)++;
        NSLog(@"f=%d,*p1=%d", f, *p1);
    }
    return 0;
}
指針變量的存儲空間,與操作系統的位數有關,位數除以8就是指針的字節數
#import <Foundation/Foundation.h>

int main()
{
    @autoreleasepool {
        int* p1;
        NSLog(@"%lu", sizeof(p1));

        float* p2;
        NSLog(@"%lu", sizeof(p2));

        double* p3;
        NSLog(@"%lu", sizeof(p3));

        char* p4;
        NSLog(@"%lu", sizeof(p4));
    }
    return 0;
}
賦值,p[i]<=>*(p+i)
#import <Foundation/Foundation.h>

int main()
{
    @autoreleasepool {
        int a[10] = {1,2,3,4,5,6,7,8,9,0};
        int* p = a;

        NSLog(@"%d", a[0]);
        NSLog(@"%d", *p);
        NSLog(@"%d", a[1]);//a[1]<=>*(a+1)
        NSLog(@"%d", *(a + 1));
        NSLog(@"%d", *(p + 1));
        NSLog(@"%d", p[1]);//p[1]<=>*(p+1)

        for (int i = 0; i < 10; i++)
        {
            printf("%d ", p[i]);
        }
        printf("\n");

        p = a;
        for (int i = 0; i < 10; i++)
        {
            printf("%d ", *p++);
        }
        printf("\n");
        p = a;//此句不可或缺
        for (int i = 0; i < 10; i++)
        {
            //printf("%d ", *p);
            //p++;
            printf("%d ", p[0]);//p[0]<=>*(p+0)<=>*p
            p++;
        }
        printf("\n");

        for (int i = 0; i < 10; i++)
        {
            printf("%d ", *(a + i));//a[i]
            //printf("%d ", *a++);//常量數組名a不能做左值
        }
        printf("\n");

        for (int i = 0; i < 10; i++)
        {
            //printf("%d ", a[i]);//a[i]<=>*(a+i)
            printf("%d ", i[a]);//i[a]<=>*(i+a)
        }
        printf("\n");
    }
    return 0;
}
數組做函數形參
#import <Foundation/Foundation.h>

void fa(int data[10])//數組做形參時,會被編譯成指針。int* data;
{
    NSLog(@"%lu", sizeof(data));
}

void print(int* data, int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%d ", data[i]);
    }
    printf("\n");
}

//寫一個函數,將傳過來的數組的每個元素加1
void increment(int *a, int size)
{
    for (int i = 0; i < size; i++)
    {
        a[i]++;
    }
    print(a, size);
}

int main()
{
    @autoreleasepool {
        int a[10] = {1,2,3,4,5,6,7,8,9,0};
        NSLog(@"%lu", sizeof(a));
        fa(a);
        print(a, 10);
        int b[5] = {10,20,30,40,50};
        print(b, 5);

        increment(a, 10);
        print(a, 10);
        increment(b, 5);
        print(b, 5);

        //C99新增的數組常量
        increment((int[5]){11,22,33,44,55}, 5);
        int *d = (int[10]){1,2,3,4,5,6,7,8,9,0};
        print(d, 10);
    }
    return 0;
}

2、進程空間

進程:正在運行的可執行文件
進程的內存空間
    代碼區:程序的源代碼(機器碼)、常量(只讀的)
    數據區:全局變量和靜態變量
    堆區:malloc申請的空間
    棧區:局部變量、形參

3、字符串

用雙引號引起來的多個字符
存儲方式
    字符數組
    字符指針
        char str1[] = "Hello";
        str1[0] = 'h';
        //str1 = "world";

        char *str2 = "Hello";
        //str2[0] = 'h';
        str2 = "world";
字符串的鍵盤輸入
        char str[100];
        //char* str1;
        NSLog(@"請輸入一個字符串:");
        scanf("%s", str);
        NSLog(@"%s", str);
字符串的庫函數
#import <Foundation/Foundation.h>

int main()
{
    @autoreleasepool {
        //字符串的賦值
        char str1[100] = "Hello";
        char str2[100];
        strcpy(str2, str1);
        NSLog(@"%s", str2);

        char str3[5];
        //strcpy(str3, str1);
        //NSLog(@"%s", str3);
        strncpy(str3, str1, 4);
        NSLog(@"%s", str3);

        //求字符串長度
        NSLog(@"%lu", strlen(str1));

        //字符串拼接
        strcpy(str1, "Hello ");
        strcpy(str2, "world!");
        strcat(str1, str2);
        NSLog(@"%s", str1);
        strcpy(str3, "he");
        //strcat(str3, str2);
        strncat(str3, str2, 2);
        NSLog(@"%s", str3);

        //字符串比較
        strcpy(str1, "Hello");
        if (strcmp(str1, "Hello") == 0)
        {
            NSLog(@"兩個字符串相同");
        }
    }
    return 0;
}

思考練習

1、從鍵盤輸入一個密碼,顯示密碼強度
包含大小寫字母數字還有其他字符的及密碼長度大於12,爲極強
包含大小寫字符數字其他字符但長度長度小於12爲強
包含大小寫字母數字其他字符中的三種爲中等爲中等
包含大小寫字母數字其他字符中的兩種一下爲弱

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
解析

#import <Foundation/Foundation.h>

int main()
{
    @autoreleasepool {
        char password[100];
        NSLog(@"請輸入一個密碼:");
        scanf("%s", password);

        int upper = 0;//大寫字母
        int lower = 0;//小寫字母
        int digit = 0;//數字
        int sign = 0;//其他字符
        int length = 0;//密碼長度
        for (int i = 0; password[i] != '\0'; i++)
        {
            if (password[i] >= 'A' && password[i] <= 'Z')
            {
                upper = 1;
            }
            else if (password[i] >= 'a' && password[i] <= 'z')
            {
                lower = 1;
            }
            else if (password[i] >= '0' && password[i] <= '9')
            {
                digit = 1;
            }
            else
            {
                sign = 1;
            }
            length++;
        }
        int sum = upper + lower + digit + sign;
        if (sum == 4 && length > 11)
        {
            NSLog(@"極強");
        }
        else if (sum == 4)
        {
            NSLog(@"強");
        }
        else if (sum == 3)
        {
            NSLog(@"中等");
        }
        else if (sum == 2 || sum == 1)
        {
            NSLog(@"弱");
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章