美文网首页
指针与字符串

指针与字符串

作者: 越天高 | 来源:发表于2019-02-18 21:21 被阅读1次
    因为数组名就是数组的地址, 数组名保存的就是数组的第0个元素的地址,所以我们可以使用指针来保存字符串
    // 保存字符串
        char str[] = "lnj";
        printf("str = %s\n", str);
        str[0] = 'm';
        printf("str = %s\n", str);
    
    通过指针保存一个字符串, 其实就是保存的字符串第0个元素的地址
        char *str2 = "lmj";
        printf("str2 = %s\n", str2);
    //    str2[0] = 'm';
        printf("str2 = %s\n", str2);
    

    通过数组保存字符串和通过指针保存字符串的区别

    1. 如果通过数组来保存字符串, 那么字符串是一个变量 str 可以修改
    2. 如果通过指针来保存字符串, 那么字符串是一个常量 str2 不能修该
    3. 数组保存的字符串存储在内存的栈中, 而通过指针保存的字符串存储在常量区
    4. 存储在栈中的变量有一个特点, 当作用域结束系统会自动释放该变量
    5. 存储在常量区中的值有一个特点, 不会被释放, 而且多个相同的值对应的地址相同

    保存字符串的两种方式:

     char str[] = "lnj";
     存储的位置: 栈
     特点: 相同的字符串会重复的分配存储空间
           字符串可以修改
     
     char *str = "lnj"
     存储的位置: 常量区
     特点: 相同的字符串不会重复的分配存储空间
            字符串不可以修改
    

    指针和字符串的注意

    // 1.指针没有初始化, 野指针
    char *str;
    scanf("%s", str);
    printf("str = %s\n", str);
    
    // 注意: 用指针来保存字符串不可以被修改
    // 指针没有初始化不能随便使用
    

    指针与数组

    // 定义数组的格式: 元素类型 数组名称[元素的个数]

    //    int  a = 10;
    //    int  b = 20;
    //    int nums[2] = {10 , 20};
        char *names[4] =
        {
            "lnj",
            "lmj",
            "jjj",
            "lk"
        };
        
        for (int i = 0; i < 4; i++) {
            printf("names[%i] = %s\n", i , names[i]);
        }
    

    指针类型的特点

    只要是数据类型就具备3个特点
    1. 可以用来定义变量
    2. 可以用来作为形参的类型
    3. 作为返回值

        int num = 10;
        change(num);
        printf("num = %i\n", num);
        
    //    char *name = "lnj";
    //    change2(name);
        
        int nums[] = {1, 3, 5};
    //  change3(nums); // 数组名就是数组的地址
        change4(nums); // 数组名就是数组第0个元素的地址
        printf("nums[0] = %i\n", nums[0]);
         */
    
     char *name = demo();
        printf("name = %s\n", name);
        
        char *name2 = demo2();
        printf("name2 = %s\n", name2);
        
        return 0;
    
    char *demo2()
    {
        char name[]= "lnj";
        return name;
    }
    
    char *demo()
    {
        char *name = "lnj";
        return name;
    }
    
    void change4(int *p)
    // int *p = nums; == int *p = &nums; == int *p = &nums[0]
    // int *p; p = nums;  p == nums;
    {
        p[0] = 998;
    }
    // 不专业
    void change3(int values[])
    {
        values[0] = 998;
    }
    
    /*
    void change2(char *p)
    {
        *p = "lmj";
    }
     */
    
    void change(int value)
    {
        value = 55;
    }
    

    指针的练习

    // 求一个字符串的长度
            char *myStr = "wodeshijie";
            printf("%i\n",myStrlen(myStr));
            printf("%i\n",myStrlen2(myStr));
             printf("%i\n",myStrlen3(myStr));
    int myStrlen(char *str)
    {
        int count =0;
        while (str[count] != '\0' ) {
            count ++;
        }
        return count;
    }
    int myStrlen2(char *str)
    {
        int count =0 ;
        while (*str++ != '\0') {
            count ++;
        }
        return count;
    }
    int myStrlen3(char *str)
    {
        int count = 0 ;
        while (*str ++) count ++;
        return count;
    }
    

    相关文章

      网友评论

          本文标题:指针与字符串

          本文链接:https://www.haomeiwen.com/subject/ephssqtx.html