精华内容
下载资源
问答
  • C语言的字符串数组与指针数组 一.字符串数组 字符串数组实际就是char类型的二维数组 const char arr[][40] = { "char mjuik ", "char;; " , " hunh ba"}; //打印地址应该用%p十六进制的但是为了看得清楚就用十进制...

    C语言的字符串数组与指针数组

    一.字符串数组

    字符串数组实际就是char类型的二维数组

    const char arr[][40] = { "char                mjuik  ", "char;;  " , "           hunh ba"};
    //打印地址应该用%p十六进制的但是为了看得清楚就用十进制打印了
    cout << "arr和arr[0]指针没有移动时\n\n";
    printf("%d,%d\n", arr, arr[0]);
    

    打印结果大家都清楚 arr 和 arr[0] 指向的是同一个地址,但是指针同时加1就不一样了;

    cout << "arr和arr[0]指针同时+1时\n\n";
    printf("%d,%d\n", arr+1, arr[0]+1);
    

    打印结果
    在这里插入图片描述
    arr 是和arr[0]是同一个地址是不错,但是它们代表的不一样,arr是代表的是二维数组的首地址而arr[0]代表的是二维数组第一行的首地址,二个指针同时+1的话arr会指向二维数组第二行的首地址,arr[0]会指向二维数组第一行的第二个元素的地址.

    二.指针数组

    const char* arr[]= { "char                mjuik  ", "char;;  " , "           hunh ba"};
    	printf("arr指向的地址:%d\narr[0]指向的地址:%d\n", arr, arr[0]);
    	
    	printf("arr所指向的字符串:%s\n", arr);
    	printf("arr[0]所指向的字符串:%s\n", arr[0]);
    
    	cout << "char* 占" << sizeof(char*) << "字节" << endl;
    

    打印结果,这二个地址会没有任何联系,arr是二维数组的首地址了,它是存储char指针的数组,这个数组中有几个字符串就有arr指针数组中就有几个char的指针,这些char* 的指针指向了我们看到的这些字符串,
    在这里插入图片描述
    可以看到arr指向了乱码

    三.总结

    虽然指针数组和字符串数组(二维数组)都能实现相同的功能,但他们的原理是相差地别的,不是一个性质

    字符串数组(二维数组)都能实现相同的功能,但他们的原理是相差地别的,不是一个性质

    展开全文
  • } 如上代码和执行结果,当我们使用字符串数组表示一段字符串时,使用sizeof得到的是包括'\0'的长度,使用strlen得到的是去除'\0'的长度。即sizeof(mystr) = strlen(mystr) + 1 。 但是,当我们使用指针来表示一段...
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int main(void)
    {
        char mystr[] = "ABCDEFGHIGKLMN";
    
        printf("The contend is:%s\r\n", mystr);
        printf("The num of mystr is(strlen):%d\r\n", strlen(mystr));
        printf("The num of mystr is(sizeof):%d\r\n", sizeof(mystr));
        printf("The pointer of mystr is:%p\r\n", mystr);
    
        return 0;
    }

    如上代码和执行结果,当我们使用字符串数组表示一段字符串时,使用sizeof得到的是包括'\0'的长度,使用strlen得到的是去除'\0'的长度。即sizeof(mystr) = strlen(mystr) + 1 。

    但是,当我们使用指针来表示一段字符串,代码和执行结果如下,

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int main(void)
    {
        char *mystr= "ABCDEFGHIGKLMN";
    
        printf("The contend is:%s\r\n", mystr);
        printf("The num of mystr is(strlen):%d\r\n", strlen(mystr));
        printf("The num of mystr is(sizeof):%d\r\n", sizeof(mystr));
        printf("The pointer of mystr is:%p\r\n", mystr);
    
        return 0;
    }

    strlen(mystr)得到的依然是去除'\0'的长度,但是sizeof(mystr)得到的是8字节长度,即64平台的指针的大小。

    展开全文
  • C语言用指针字符串数组位置颠倒,实现ABCDEFGHIJKLMNOPQRSTUVWXYZ转换成ZYXWVUTSRQPONNOPQRSTUVWXYZ
  • 字符串与字符数组 字符串一定是一个char的数组,但char的数组未必是字符串。——以字符’\0’结尾的char数组就是一个字符串,但如果char数组没有以’\0’结尾,那么就不是一个字符串,只是普通字符数组,所以字符串...

    字符串与字符数组

    字符串一定是一个char的数组,但char的数组未必是字符串。——以字符’\0’结尾的char数组就是一个字符串,但如果char数组没有以’\0’结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char数组

    两者的区别:
    字符串:
    1、字符串赋初值用双引号引起来;
    2、以隐含的空字符\0结束,占用字节数+1,注意:1字节/字母,2字节/汉字;
    3、字符串可以使用%s格式化输出。
    普通字符数组:
    1、普通的字符数组赋初值用大括号引起来;
    2、不包含空字符,占用字节数不需+1;
    3、普通字符数组使用%s格式化输出,输出结果会乱码,因为没有’\0’结束符。
    例如:

    #include <stdio.h>
    #include <string.h>
    int main(void)
    {
        /*字符数组赋初值*/
        char cArr[] = {'I','L','O','V','E','C'};
        /*字符串赋初值*/
        char sArr[] = "ILOVEC";
        /*用sizeof()求长度*/
        printf("cArr的长度=%d\n", sizeof(cArr));
        printf("sArr的长度=%d\n", sizeof(sArr));
        /*用printf的%s打印内容*/
        printf("cArr的内容=%s\n", cArr);
        printf("sArr的内容=%s\n", sArr);
        return 0;
    }
    

    运行结果为:
    在这里插入图片描述
    如果定义:

     char cArr[] = {'I','L','O','V','E','C','\0'};
     char sArr[] = "ILOVEC";
    

    那么cArr与sArr就完全相同,都表示同一字符串。

    另外,%s格式化输出从当前地址到结束标志’\0’之前的所有字符,如:

    #include <stdio.h>
    #include <string.h>
    int main(){
        char str[] = "http://c.biancheng.net";
        printf("%s\n", str); //直接输出字符串
        printf("%s\n", str+1); //输出从第二个地址到最后的值
        printf("%s\n", str+2); //输出从第三个地址到最后的值
        return 0;
    }
    

    在这里插入图片描述
    通过对以上代码的分析,现在我们可以很简单地总结出字符数组和字符串二者之间的区别:
    对于字符数组,其长度是固定的,其中任何一个数组元素都可以为 null 字符。因此,字符数组不一定是字符串。
    对于字符串,它必须以 null 结尾,其后的字符不属于该字符串。字符串一定是字符数组,它是最后一个字符为 null 字符的字符数组。

    字符串数组与字符串指针

    字符串数组:

    //字符串数组
    #include <stdio.h>
    #include <string.h>
    int main(){
        char str[] = "http://c.biancheng.net";
        int len = strlen(str), i;
        //直接输出字符串
        printf("%s\n", str); //可以直接输出当前地址(字符串首地址)到结束标志'\0'之前的所有字符
        //每次输出一个字符
        for(i=0; i<len; i++){
            printf("%c", str[i]);
        }
        printf("\n");
        return 0;
    }
    

    字符串指针:

    //字符串指针
    #include <stdio.h>
    #include <string.h>
     
    int main(){
    char *str = "http://c.biancheng.net";
    int len = strlen(str), i;
     
    //直接输出字符串
    printf("%s\n", str); //可以直接输出当前地址(字符串首地址)到结束标志'\0'之前的所有字符
    //使用*(str+i)
    for(i=0; i<len; i++){
    printf("%c", *(str+i));
    }
    printf("\n");
    //使用str[i]
    for(i=0; i<len; i++){
    printf("%c", str[i]);
    }
    printf("\n");
     
    return 0;
    }
    

    运行结果都是:
    http://c.biancheng.net

    这一切看起来和字符数组是多么地相似,它们都可以使用%s输出整个字符串,都可以使用*或[ ]获取单个字符,这两种表示字符串的方式是不是就没有区别了呢?

    有!它们最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。

    内存权限的不同导致的一个明显结果就是,字符数组在定义后可以读取和修改每个字符,而对于第二种形式的字符串,一旦被定义后就只能读取不能修改,任何对它的赋值都是错误的。

    我们将第二种形式的字符串称为字符串常量,意思很明显,常量只能读取不能写入。请看下面的演示:

    
    #include <stdio.h>
    int main(){
    char *str = "Hello World!";
    str = "I love C!"; //正确
    str[3] = 'P'; //错误
     
    return 0;
    }
    

    这段代码能够正常编译和链接,但在运行时会出现段错误(Segment Fault)或者写入位置错误。
    第4行代码是正确的,可以更改指针变量本身的指向;第5行代码是错误的,不能修改字符串中的字符。

    到底使用字符数组还是字符串常量
    在编程过程中如果只涉及到对字符串的读取,那么字符数组和字符串常量都能够满足要求;如果有写入(修改)操作,那么只能使用字符数组,不能使用字符串常量。

    最后我们来总结一下,C语言有两种表示字符串的方法,一种是字符数组,另一种是字符串常量(用指针表示),它们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。

    展开全文
  • 和数组形式定义的字符串相同,数组形式定义的字符串数组,存储了字符串字面量的副本,可以直接对这些字符串进行更改 d. 其中每个含有m个元素的数组必须不大不小的将数组填满,如果字符串长度小于m-1,其余位置就补...

    1.char a[n][m]:

    a. a是一个内含n个数组的数组,每个数组的大小为m字节,于是在内存中a占用了(n*m)个字节的空间
    b. 数组名a具有地址含义,指向第一个拥有m个字符元素数组

     注意:此时如果给a赋值,那么字符串的长度不能超过m-1
    

    c. 和数组形式定义的字符串相同,数组形式定义的字符串数组,存储了字符串字面量的副本,可以直接对这些字符串进行更改
    d. 其中每个含有m个元素的数组必须不大不小的将数组填满,如果字符串长度小于m-1,其余位置就补’\0’。
    e. ps:在初始化时,m绝对不能缺省,n可以缺省

    2.const char *a[m]—(const可省略)

    a. a是一个内含m个指针的数组(指针就是地址)在我的电脑中,每个地址用8个字节来储存,a在计算机中占据了8m个字节的空间
    b. 这表示a[i]是一个指针,指向第i个字符串
    c. a[2][1]表示指针所指的第3个字符串中的第2个字符元素
    d. 和指针形式定义的字符串相同,指针形式定义的字符串数组,其中的字符串字面量存储在静态存储区,所以不可以更改
    e. 每一个字符串并没有固定的长度,甚至不同的字符串不必存储在连续的内存空间中

    3.程序示例

    /*探究指针数组和字符串数组的区别与联系*/
    #include <stdio.h>
    #define SLEN 40
    #define LIM 5
    
    int main()
    {
        /*指针数组定义字符串*/
        /*这是一个内含5个指针的数组*/
        const char *mytalents[] = {
            "Adding number swiftly",
            "Multipling accurately",
            "Stashing data",
            "Following instructions to the letter",
            "Understanding the C language"};
        /*字符串数组*/
        /*内含5个数组的数组,每个数组的大小为40*/
        char yourtalents[LIM][SLEN] = {
            "Walking in a straight line",
            "Sleeping",
            "Watching television",
            "Mailing letters",
            "Reading email"};
    
        int i;
        puts("Lets compare talents.");
    
        /*%-36s的意思(推测)是之后要打印的字符串共占据36个字符位;有-代表先打印字符再打印空格,没有-则表示先打印空格再打印字符*/
        printf("%-36s %-25s\n", "My Talents", "Your Talents");
    
        for (i = 0; i < LIM; i++)
        {
            printf("%-36s %-25s\n", mytalents[i], yourtalents[i]);
        }
        printf("\nsizeof mytalents:%lld, sizeof yourtalents: %lld\n", sizeof(mytalents), sizeof(yourtalents));
        return 0;
    }
    
    程序输出:
    Lets compare talents.
    My Talents                           Your Talents
    Adding number swiftly                Walking in a straight line
    Multipling accurately                Sleeping
    Stashing data                        Watching television
    Following instructions to the letter Mailing letters
    Understanding the C language         Reading email
    
    sizeof mytalents:40, sizeof yourtalents: 200
    
    展开全文
  • C语言:字符串数组与字符串指针数组

    万次阅读 多人点赞 2019-04-27 21:46:19
    1,首先,不论是局部,静态还是全局数组都必须在定义的时候初始化,否则就得通过其他方式,eg 循环操作,字符串处理函数strcpy() ...3,那么问题来了,字符串数组和字符串指针数组有什么区别 ...
  • 1.字符串指针表示: char* pStr = "helloworld"; 2.char[]和char*的区别: 地址和地址的存储信息; 可变不可变; 首先我们来理解可变不可变这个概念,先来看个例子: #include<iostream> using ...
  • 二位字符串数组用指针数组、数组指针、二级指针打印 2、测试代码 #include int main() { char value[4][5] = {"chen", "yu", "feng", "yy"}; char *p[5]; char (*p1)[5]; char **p2; //把二位数组...
  • 字符串指针字符串指针与字符数组的区别与字符数组的区别 转载
  • 主要介绍了C++中字符串以及数组指针的互相使用讲解,是C++入门学习中的基础知识,需要的朋友可以参考下
  • 原创 C语言:字符串数组与字符串指针数组 ...
  • 字符 字符串 字符数组 字符串指针 指针数组

    千次阅读 多人点赞 2018-10-23 16:00:06
    字符指针字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。 char *ps=&quot;C Language&quot;; 顺序是:1....
  • 字符串指针与字符串数组

    千次阅读 2019-06-11 12:41:52
    C/C++中每一个字符串都以‘\0’结尾,以..."0123456789"看起来只有十个字符,但是我们在复制的时候需要在字符串的末尾加上’\0’,因此要正确复制该字符串,至少需要一个长度为11个字节的数组。 为了节省内存,C/C+...
  • #include <iostream> using namespace std; int main() { char str1[50] = { 0 }; char str2[] = "i love you!"; char* p; char* q; for (p = str2, q = str1; *p != '\0'; p++,q++) ...}
  • 文章目录字符数组与字符指针字符数组字符指针指针数组字符串) 字符数组与字符指针 在C语言中,可以用两种方法表示和存放字符串: (1)用字符数组存放一个字符串 char str[]="I am happy"; (2)用字符...
  • C语言里的指针数组字符串等等这些东西在我编程入门的时候一直捋不清楚,而为什么捋不清楚,是因为我不知道程序运行时内存是怎么分区的,更不知道这些变量啊、常量啊究竟是放在内存里的什么地方。所以说,想清晰...
  • C++处理字符串有两种方式,即:指针方式和数组方式 数组方式:char a[] = "HelloWorld"; 指针方式:const char* s= "HelloWorld"; const可以忽略 接下来详细讲解一下字符串指针 首先,为什么字符串可以直接赋值给...
  • 字符串指针与字符串数组的区别

    千次阅读 2018-10-29 15:08:55
    char *a char a[] 的区别 char *a = &quot;hello&quot; 中的a 是指向第一个字符 a...实例:把两个字符串相加 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include
  • //字符串数组 #include <stdio.h> #include <string.h> int main(){ char str[] = "http://c.biancheng.net"; int len = strlen(str), i; //直接输出字符串 printf("%s\n", str); //每次输出一个...
  • 上面是定义了一个字符串数组及一个指向这个字符串数组指针,可以通过这个指针对数组中的内容进行操作;例如:*(pstr + i) = 'a'; 但是下面的情况不可以直接对数组进行操作:char *str = "1234567asdf&...
  • 讨论: 字符串数组与字符串指针数组

    千次阅读 2016-04-20 10:14:27
    由于原来学习C语言字符串时,常把字符串数组与字符串指针数组弄不清楚,它们的元素都可以用作字符串标准库函数的实参,但是自己写函数调用时,却出了不少问题,所以我就有了想再次学习它们打算。
  • 1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符。 如在代码中写"abc",那么编译器帮你存储的是"abc\0"。 2. "abc"是常量吗?-----------注意字符串的存储形式 答案是有...
  • C语言字符串及指向字符数组指针

    千次阅读 2020-06-25 10:09:09
    字符数组长度 通常编译器在“肉眼所能...指针字符串 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char *s="Hello World"; char *s2="Hello Worl
  • 三、字符串与指针 四、字符数组与字符指针 一、字符数组 字符数组是存放字符数据的数组,每个元素都是单个字符。 (1)字符数组的定义 char 数组名[数组长度];//一维字符数组 char 数组名[常量表达式1][常量...
  • 题目是这样的:假设定义了一个指针数组tBooks如下,请定义一个指向它的数组指针p,让程序可以顺利执行,并按要求打印出数据。 关键代码: char *tBooks[] = { "《数据结构》", "《计算机组成原理》", "...
  • 1.字符串常量只能读取,不能修改;字符数组可以读取和修改。...2.以指针形式赋值的字符串,只能修改字符串指针,不能修改字符串内容,而字符数组形式的字符串,可以修改字符串中的每个字符。 ...
  • C++基础 -- 指针与数组1、一维数组和指针1.1、一维数组的地址1.2、指向一维数组的指针变量1.3、通过指针访问一维数组元素 1、一维数组和指针 1.1、一维数组的地址   数组由若干元素组成,每个元素都有相应的...
  • 一、复习普通变量与指针变量的区别 所有变量的基本属性:变量名称,值,地址(分配...字符串数组char* arry[]在栈上申请空间,存储字符串地址,字符串实际是存储在只读存储区,在排序时交换的是字符串地址。 #include
  • 试验06 数组指针字符串4课时 第6章 数组指针字符串 一试验目标 (1) 学习使用数组数据对象 (2) 学习字符串数据组织和处理 (3) 学习标准C++库使用 (4) 掌握指针使用方法 (5) 练习经过调试功效观察指针内容及其所指...
  • 字符指针变量和字符数组的区别:简单说一下:字符串数组是用来存放字符串的数组,在内存中占一段连续的单元。所占内存存放的是字符串。定义方法为:char a[N];N为常量表达式,可初始化。字符指针是指向字符的指针,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 392,225
精华内容 156,890
关键字:

字符串数组与指针