zoukankan      html  css  js  c++  java
  • 【C/C++】字符数组:char,char*,char a[], char *a[], char **s 的区别与联系/const char*和char*的区别

    一、char,char*,char a[], char *a[], char **s 的区别与联系

    C语言中的字符串是字符数组,可以像处理普通数组一样处理字符串。
    可以理解为在内存中连续存储的字符。

    1. 从实用主义而言,我们先给出结论。
      我们会用到的一般有两种。
      · 声明一个字符串:char* a = "abcdefg";
      · 声明一组字符串:char* a[] = {"China","French","America","German"};

    2. 原理
      这里只考虑静态数组,在内存中划分了连续的地址空间。字符串以“”为结尾符。

    3. 地址/字符串的输出与查看
      假设a是一个指针变量,为了查看这个指针变量的内容,我们可以用%p输出查看。printf("%p",a);
      查看这个字符型指针变量的字符串:printf(%s,a);
      注意指针变量也是存在内存里的,自己也有个地址。用&a表示。

    4. char*
      很多资料中会写成char* a而不是char a,事实上我本科学C语言的时候一直认为是char (a),但其实前者可以一起理解:

    **char*: 用于声明一个只是保存字符串首地址的指针变量**
    1. 符号优先度
      a[]的优先度大于*a。

    2. 指针与二级指针
      这里可以回到我们开头所说的两种定义了。
      第一种:
      · 声明一个字符串:char* a = "abcdefg";
      这个理解起来非常容易,定义了一个字符串"abcdefg",在连续的内存空间里存储,并且定义了一个保存这个字符串的首地址的指针变量a,所以a的值为字符’a‘所存的地址。
      如果我们用printf("%s",a),将输出abcdefg。
      · 声明一组字符串:char* a[] = {"China","French","America","German"};
      a[]是一个4长数组,里面存了四个指针变量:a[0],a[1],a[2],a[3]。分别指向字符串China,French,American和German的首地址。
      而a[]的值也就是a也就是这个数组的首地址,也就是a[0]的地址。
      ·二级指针
      二级指针就是指针的指针。在第二种声明中,我们用到的二级指针:
      a[0]是指向字符串China的指针,而a是指向a[0]的指针。
      二级指针的赋值与声明:char **s = a; //定义了一个名为s的二级指针,指向a的地址
      即,*s=a[0],也就是printf("%s",*s)

    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include <string>
    #include <iostream>
    using namespace std;
    
    int main(){
        char* a[] = {"China","French","America","German"};
        printf("%p
    ",a);
        for (int i = 0; i < 4; i++){
            printf("a[%d] is %p
    ",i, a[i]); //用于查看a[i]的内容(所指的目标的地址值)
            printf("address a[%d] is %p
    ",i, &a[i]); //用于查看a[i]自己的地址
            //printf("%d
    ",sizeof(&a[i])); 
            printf("%d
    ",sizeof(a[i])); //用于查看a[i]自己的大小(指针变量的大小 4字节)
            printf("%s
    ",a[i]); //用于打印指针变量的字符串
        }
        char **s = a; //定义二级指针s
        printf("%p
    ",s); //输出s=a[0]的地址
        printf("%s
    ",*s); //输出*s=a[0]所指的字符串
        cout << a[0][2]; //i 
        cout << (*s)[2]; //i
        system("pause");
    }
    
    

    运行结果:
    在这里插入图片描述

    ·二级指针的用处:二维数组传参
    参考另外一篇博文:【C/C++】二维数组的传参的方法 https://www.cnblogs.com/kinologic/p/13958685.html

    这种二级指针的每一

    二、C语言中char* 和const char*的区别

    const char*char*
    首先,char*:用于声明一个【只是保存字符串首地址的】指针变量

    const char *:指针指向的内容不可变,但指针本身可以再赋值。

    C 语言中char* 和const char*的区别:

    一、含义的区别

    char* 表示一个指针变量,并且这个变量是可以被改变的。

    const char*表示一个限定不会被改变的指针变量。

    二、模式的区别

    char*是常量指针,地址不可以改变,但是指针的值可变。

    const char*是指向常量的常量指针,地址与值均不可变。

    三、指针指向的内容的区别

    一句话总结来说,就是指针(地址)里放的东西能不能变的区别。
    char定义的指针的地址里面存的东西可以变,但是const char定义的指针的地址里面存的东西不能变,要修改const char#定义的指针指向的东西的值,只能新开辟其他的地址里面的东西,然后把地址的值改掉。

    可以看到,将p指向的内容由123改为456之后,p里面存的的地址变了。


    我们把原来的p里面所存的123的地址再输出,发现还是123.也就是地址里存的东西不变。

    char*指针指向的【内容】是可以改变的,是不固定的。赋值后在数据传递的过程中允许改变。

    const char*指针指向的【内容】是固定的,不可改变的。对传入的参数,不会对指针指向的内容进行修改

    【??问题】

    同样的操作我对char*又做了一遍,发现好像没有区别?

    四、意义的区别

    char* str确保str这个指针不会改变,但是这个指针里面的内容可以改变。

    const char* str确保*str的内容不会改变,也就是用str这个指针无法改变str这个指针指向的地址的内容,但是可以改变这个指针。

    可以看出两种类型不同,不可以将const char型变量赋值给char型变量。
    两种类型不一样
    但是可以通过强制转换赋值:

    三、const [类型]* p 和[类型]* const p的区别与联系

  • 相关阅读:
    网络安全之数字签名
    python爬取并分析淘宝商品信息
    循环与分支——python
    线性相关与线性无关
    linux之文件传输协议(FTP)与本地用户测试
    递归下降语法分析
    MySQL:索引
    一个基础又很重要的知识点:JDBC原理(基本案例和面试知识点)
    Tomcat的部署、虚拟主机及优化
    二叉树深度
  • 原文地址:https://www.cnblogs.com/kinologic/p/13924778.html
Copyright © 2011-2022 走看看