精华内容
下载资源
问答
  • 指针定义字符串 char *b="abcdefg" 从表面上来看是一样的,a是一个数组指针,好像和b等价,其实不是这样的,区别可以从下面这个程序看出 //情况1 char a[]="abcdefg"; *a='1'; //情况2 char *b="abcdefg"; *...

    在C语言中,对于字符串有这样一个问题

    数组定义的字符串

    char a[]="abcdefg"

    和指针定义的字符串

    char *b="abcdefg"

    从表面上来看是一样的,a是一个数组指针,好像和b等价,其实不是这样的,区别可以从下面这个程序看出

    //情况1
    char a[]="abcdefg";
    *a='1';
    //情况2
    char *b="abcdefg";
    *b='1';

    其中情况1是可以实现的,但是情况2却是会报内存溢出的错误,原因是虽然都是定义一串字符串,但是数组定义的字符串中每一个元素都是可读可写的,但是指针定义的字符串是存放在静态变量区的,不能对单个元素进行更改,只能读不能改。所以下面这种情况是允许的:

    char *b="abcdefg";
    cout<<*(b+2);

    但是指针字符串可以实现b=a的操作,相当于把b指针指向a字符串的地址

    展开全文
  • 字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题: 1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首...

    用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:


    1.     字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。

    2.     对字符串指针方式

    char *ps="C Language";

    可以写为:

        char *ps;

    ps="C Language";

    而对数组方式:

        static char st[]={"C Language"};

    不能写为:

        char st[20];

        st={"C Language"};

    而只能对字符数组的各元素逐个赋值。


         从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。

    当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
    一个错误的例子,如下:       
               char *name;
               scanf("%s",name);
               printf("%s",name); 
     
    有的编译器虽然也能通过,但这是错误的,因为是个指针,定义时指向不可用的地址。解决这个问题有两种方法:用数组的方法或给字符针针分配内存空间的方法。
               数组的方法:
                     char name[20];
                     scanf("%s",name);
                     printf("%s",name); 
         
            给字符针针分配内存空间的办法: 
                     char *name;
                     name=(char*)malloc(50);      //此时name已经指向一个刚刚分配的地址空间。
                     scanf("%s",name);
                     printf("%s",name);

    但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。

    3. int  main()
    {
     char str1[40]="hello world!";     //char *str1="hello world!";
     str1[4]='A';                      //若str1是指针型的,编译通过,但运行是此处会段错误
     printf("%s\n",str1);
     return 0; 
    }


           数组和指针都可以在它们的定义中用字符串常量进行初始化,尽管看上去一样,底层的实现机制却不相同。

           定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。例如:下面的定义创建了一个字符串常量(为其分配了内存):

           char *p=”abcdefg”;

           注意只有对字符串常量才是如此,不能指望为浮点数之类的常量分配空间,如:

           Float *p=3.14;  /*错误,无法通过编译*/

    下面结合一个实例谈谈初始化指针时创建的字符串常量与数组中的字符串的区别:

    1. 在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
    2. 数组也可以用字符串常量进行初始化:

           Char a[]=”abcdefg”;

           如指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。

           下面是一个在vc6中的一个例子,完成将一个字符串中的所有大写字母全部转换为小写字母的功能:

    [cpp]  view plain  copy
    1. View Code  
    2.  1 #include<iostream.h>  
    3.  2 #include<ctype.h>  
    4.  3   
    5.  4  /******************************************************************************/  
    6.  5 /* 
    7.  6  *    Convert a string to lower case 
    8.  7  */  
    9.  8   
    10.  9 int strlower(char *string)  
    11. 10 {  
    12. 11     if(string==NULL)  
    13. 12     {  
    14. 13         return -1;  
    15. 14     }  
    16. 15   
    17. 16     while(*string)  
    18. 17     {  
    19. 18         if(isupper(*string))  
    20. 19             *string=tolower(*string);  
    21. 20         string++;  
    22. 21     }  
    23. 22     *string='\0';  
    24. 23     return 0;  
    25. 24 }  
    26. 25 /*char *strlower(char *string) 
    27. 26 { 
    28. 27     char    *s; 
    29. 28  
    30. 29      
    31. 30  
    32. 31     if (string == NULL) { 
    33. 32         return NULL; 
    34. 33     } 
    35. 34  
    36. 35     s = string; 
    37. 36     while (*s) { 
    38. 37         if (isupper(*s)) { 
    39. 38             *s = (char) tolower(*s); 
    40. 39         } 
    41. 40         s++; 
    42. 41     } 
    43. 42     *s = '\0'; 
    44. 43     return string; 
    45. 44 } 
    46. 45 */  
    47. 46   
    48. 47 void main()  
    49. 48 {  
    50. 49     char *test="ABCDEFGhijklmN";  
    51. 50     strlower(test);  
    52. 51     cout<<test<<endl;  
    53. 52 }  

    其中,如果采用char *test=”ABCDEFGhijklmN”;会产生运行时错误。Char test[]=”ABCDEFGhijklmN”则程序正常运行,原因如前所述。

        用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:

    1.     字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。

    2.     对字符串指针方式

    char *ps="C Language";

    可以写为:

        char *ps;

    ps="C Language";

    而对数组方式:

        static char st[]={"C Language"};

    不能写为:

        char st[20];

        st={"C Language"};

    而只能对字符数组的各元素逐个赋值。

         从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。

    当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
    一个错误的例子,如下:       
               char *name;
               scanf("%s",name);
               printf("%s",name); 
     
    有的编译器虽然也能通过,但这是错误的,因为是个指针,定义时指向不可用的地址。解决这个问题有两种方法:用数组的方法或给字符针针分配内存空间的方法。
               数组的方法:
                     char name[20];
                     scanf("%s",name);
                     printf("%s",name); 
         
            给字符针针分配内存空间的办法: 
                     char *name;
                     name=(char*)malloc(50);      //此时name已经指向一个刚刚分配的地址空间。
                     scanf("%s",name);
                     printf("%s",name);

    但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。

    3.int  main()
    {
     char str1[40]="hello world!";     //char *str1="hello world!";
     str1[4]='A';                      //若str1是指针型的,编译通过,但运行是此处会段错误
     printf("%s\n",str1);
     return 0; 
    }


           数组和指针都可以在它们的定义中用字符串常量进行初始化,尽管看上去一样,底层的实现机制却不相同。

           定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。例如:下面的定义创建了一个字符串常量(为其分配了内存):

           char *p=”abcdefg”;

           注意只有对字符串常量才是如此,不能指望为浮点数之类的常量分配空间,如:

           Float *p=3.14;  /*错误,无法通过编译*/

    下面结合一个实例谈谈初始化指针时创建的字符串常量与数组中的字符串的区别:

    1. 在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
    2. 数组也可以用字符串常量进行初始化:

           Char a[]=”abcdefg”;

           如指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。

           下面是一个在vc6中的一个例子,完成将一个字符串中的所有大写字母全部转换为小写字母的功能:

    [cpp]  view plain  copy
    1. View Code  
    2.  1 #include<iostream.h>  
    3.  2 #include<ctype.h>  
    4.  3   
    5.  4  /******************************************************************************/  
    6.  5 /* 
    7.  6  *    Convert a string to lower case 
    8.  7  */  
    9.  8   
    10.  9 int strlower(char *string)  
    11. 10 {  
    12. 11     if(string==NULL)  
    13. 12     {  
    14. 13         return -1;  
    15. 14     }  
    16. 15   
    17. 16     while(*string)  
    18. 17     {  
    19. 18         if(isupper(*string))  
    20. 19             *string=tolower(*string);  
    21. 20         string++;  
    22. 21     }  
    23. 22     *string='\0';  
    24. 23     return 0;  
    25. 24 }  
    26. 25 /*char *strlower(char *string) 
    27. 26 { 
    28. 27     char    *s; 
    29. 28  
    30. 29      
    31. 30  
    32. 31     if (string == NULL) { 
    33. 32         return NULL; 
    34. 33     } 
    35. 34  
    36. 35     s = string; 
    37. 36     while (*s) { 
    38. 37         if (isupper(*s)) { 
    39. 38             *s = (char) tolower(*s); 
    40. 39         } 
    41. 40         s++; 
    42. 41     } 
    43. 42     *s = '\0'; 
    44. 43     return string; 
    45. 44 } 
    46. 45 */  
    47. 46   
    48. 47 void main()  
    49. 48 {  
    50. 49     char *test="ABCDEFGhijklmN";  
    51. 50     strlower(test);  
    52. 51     cout<<test<<endl;  
    53. 52 }  

    其中,如果采用char *test=”ABCDEFGhijklmN”;会产生运行时错误。Char test[]=”ABCDEFGhijklmN”则程序正常运行,原因如前所述。

    展开全文
  • char message[]="Hello"; char *message="Hello"; 这两行代码一样吗? (上次编程,就是这个问题,让我多花了半个小时检查该错误) 答案是:不一样 当然,两者有区别,也有相同之处 ...字符串存储:创建
    char message[]="Hello";
    char *message="Hello";

    这两行代码一样吗? (上次编程,就是这个问题,让我多花了半个小时检查该错误哭

    答案是:不一样

    当然,两者有区别,也有相同之处

    相同之处:

    对两者求strlen()长度一致,都是5。

    不同之处:

    (1)存储模型不同

    数组存储是:每个字母占一个单元格,总共需要6个单元格

    字符串存储:创建一个名为message的指针单元格,然后指向存储“hello”这个字符串。

    (2)sizeof()大小不同

    数组存储求sizeof()是6个字节

    字符串存储求sizeof()是4个单元格

    (3)存储区域不同

    数组存储在栈中;

    字符串常量存储在全局变量区。

    同时,数组存储的变量可以修改,但是字符串常量不可以修改。

    附录测试程序:

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char message[]="Hello";
    	char *message1="Hello";
    	printf("%d\n",sizeof(message));
    	printf("%d\n",sizeof(message1));
            printf("%d\n",strlen(message));
    	printf("%d\n",strlen(message1));
    }

    运行结果:

    6

    4

    5

    5

    展开全文
  • 1、使用指针的方式定义字符串 char *s = "hello"; 这种方式可以给指针变量s赋予不同的地址,但是s所指向地址中的内容是不会变的。 也就是说指针的指向可以改变。但是所指向的内容是不能改变的。 因此使用指针的...

    在c语言中定义一个字符串有两种方式

    1、使用指针的方式定义字符串

    char *s = "hello";
    

    在这里插入图片描述
    这种方式可以给指针变量s赋予不同的地址,但是s所指向地址中的内容是不会变的。
    也就是说指针的指向可以改变。但是所指向的内容是不能改变的。
    因此使用指针的方式是不能操作所指向地址中的内容。

    char *s = "hello";
    s = "world";//这种操作是正确的。只是改变了指针的指向,并没有改变所指向地址中的内容
    
    char *s = "hello";
    *s='w';//s[0]='w';改变了指针指向地址的内容,因此运行出错
    

    2、使用字符数组的方式定义字符串

    char a[] = "hello";
    

    在这里插入图片描述
    这种方式数组a只能对应一个内存区域,不能改变a的指向,但是能够改变a所对应的地址中的内容
    指针的指向不能发生改变,但是所指地址的内容是可以改变的

    char a[] = "hello";
    a = "world";//错误;不能改变a的指向
    
    char a[] = "hello";
    *a = 'w';
    a[1] = 'o';正确;可以通过指针或下标改变所指向地址的内容;
    
    展开全文
  • 字符串指针定义字符串位于内存常量区,一般的编译器都是不允许修改它的内容 的。所以 char * a = "I am a Chinese";时,行不通。具体代码如下: char * reverse_str(char * str)  {  if...
  • 一、定义字符串有2种方式: 1、数组(变量字符可修改) char name [ ] ="dujun"; 2、指针(常量字符不可修改) char *name = “dujunabc”; 二、原因分析: 内存中分为: 1、常量区 存放常量字符串,如...
  • 数组定义字符串: ...指针定义字符串: 指针定义的字符串是存储在内存中的静态存储空间中,可读但不可写,并且如果再定义一个相同的字符串,指针的值不会变,还会指向原来的地址,不会开辟新的存储空间,看如...
  • 使用指针实现字符串复制

    千次阅读 2014-12-07 17:17:52
    使用指针实现字符串复制
  • C语言如何用指针指向字符串

    千次阅读 2020-01-30 18:13:08
    part 1 指针定义字符串 指针定义字符串,输出它的地址: #include<stdio.h> int main() { char *s1="Hello World"; char *s2="Hello World"; printf("0x%p\n",s1); printf("0x%p\n",s2); } ...
  • 字符串,字符指针字符串指针,字符数组

    千次阅读 多人点赞 2019-01-06 13:04:02
    对于指针可能是大多数程序员最痛苦的事,尤其是指针字符串和数组三者放在一起的时候,经历了几次错误后,我打算总结一下这几者的区别. 字符串:"asdasfsff",c语言中后面有'\0'. 字符数组:A[7] = |'a'|'b'...
  • 初学C,的是VS2017 char *p="xxx"; 这么简单的定义语句提示 const ...然后在char前面加上const就一切正常了,但字符串指针难道不是char *p这样定义的么?怎么样才能定义一个字符串指针变量?难道是因为VS2017的问题么?
  • 在程序中定义字符串? #define string1 "I am String No.1" char string2[] = "I am String No.2"; char *string3 = "I am String No.3";...char类型数组 定义字符串时, 应该注意指定数组大小时, 要保证数组的元素
  • 使用指针和数组两种方式定义字符串 #include<stdio.h> void main() { char string[] = "i love china!"; char* string_ = "i love china!"; printf("%s\n", string); printf("%s", string_); } 从汇编...
  • 指针字符串

    2017-09-08 21:42:29
    一、字符串的表示形式 在 C++中,我们可以两种方式访问字符串。...} (2)字符指针指向一个字符串。 可以不定义字符数组,而定义一个字符指针字符指针指向字符串中的字符。 int main() { ch
  • 用指针实现字符串反转

    千次阅读 2019-09-23 22:30:38
    只需要定义两个char类型的指针p1、p2,一个指向字符串起始地址,一个指向最后一个字符地址,交换它们的值。 接下来指针p1指向第二个字符地址,指针p2指向倒数第二个字符地址,交换它们的值。 依此类推,交换第三个...
  • *烟台大学计算机学院学生 *All rights reserved. *文件名称:用指针指针处理字符串 *作者:杨飞
  • 定义两个字符指针*p、*q,一个字符串数组str[20],p指向字符串的首地址,q指向字符串的尾地址,再首位交换 注意:指针一旦定义后,一定要赋值 C代码: #include<stdio.h> #include<string.h> void main() ...
  • 指针字符串

    2015-04-02 17:14:40
    指针的用法是极其丰富又比较复杂的,在这里简单谈一下指针和字符串。..."是等效的,我们知道C语言当中是没有字符串变量是没有办法直接定义的,所以我们平时定义字符串变量可以通过两种途径,一种是通
  • 可以通过字符数组或字符指针定义字符串,也可以宏定义对常量字符串进行定义。 通过字符数组定义字符串 一维的情况如下: char string0[10];//定义个长度为10的字符串,但未赋值 char string1[]="prison break";//...
  • 字符指针字符串

    千次阅读 多人点赞 2018-04-23 21:54:38
    我们可以用字符串常量对字符指针进行初始化。例如,有说明语句:char *str = "This is a string.";是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。这里要...
  • C语言 指针字符串

    2016-01-11 13:13:01
    一个字符串由一个或多个字符组成,因此我们可以字符数组来存放字符串,不过在数组的尾部要加上一个空字符'\0'。 char s[] = "mj"; 上面的代码定义了一个字符数组s来存储字符串"mj",系统会自动在尾部加上一个空...
  • 指针字符串常量

    2020-07-25 18:04:07
    指针字符串常量 选择为真的表达式: char str1[] = “abc”; char str2[] = “abc”; const char str3[] = “abc”; const char str4[] = “abc”; const char *str5 = “abc”; const char *str6 = “abc”...
  • 详细介绍了易如何用指针来操作字符串字符串指针,包括指针数组传参。
  • C语言-指针字符串

    2014-10-10 10:54:49
    字符串回顾一、用指针遍历字符串的所有字符二、用指针直接指向字符串三、指针处理字符串的注意 说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你...
  • 字符串在内存中的起始地址称为字符串指针,可以定义一个字符指针变量指向一个字符串字符串的表示与引用 在C语言中,既可以字符数组表示字符串,也可用字符指针变量来表示;引用时,既可以逐个字符引用,也...
  • 在C++中,调用#include,可以使用string类来定义字符串 string str="hello world"; 如果我们试图以下方法,像C语言一样去定义一个指针变量指向首地址,编译器会报错。 string str="hello world"; char* pstart=...
  • 字符串指针字符串数组的区别

    千次阅读 2013-10-08 09:10:39
    字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题: 1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一...
  • 指针字符串指针与函数

    千次阅读 2018-11-21 09:51:35
    标题1、 指针字符串的千丝万缕 由于在C语言中,是通过字符数组来存储字符串的,因而前面通过指针对一维数组和二维数组的操作方法,同样适用于字符串。其实,对字符串的操作最好采用字符串操作函数。 #include&...
  • 一、字符指针 1、 定义指向字符串的的指针变量  char *p=”China”; ... 注意:这里没有定义字符串数组,但字符串在内存中还是以数组形式存放,占有一片...问题提出:将字符串用指针逐个输出? 主函数如下: v

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 421,735
精华内容 168,694
关键字:

如何用指针定义字符串