精华内容
下载资源
问答
  • 浅谈数组与指针表示字符串的区别

    千次阅读 2015-07-27 18:08:36
    指针表示字符串 /1/指针变量所占内存空间根据操作系统的位数会发生变化,同一位数操作系统下是固定的,64位操作系统占8个字节; /2/当指针变量指向字符串时,不能改变字符串的值,因为字符串只存在常量区,常量区的...


    指针表示字符串

    /1/指针变量所占内存空间根据操作系统的位数会发生变化,同一位数操作系统下是固定的,64位操作系统占8个字节;

    /2/当指针变量指向字符串时,不能改变字符串的值,因为字符串只存在常量区,常量区的值不能被改变;

    /3/指针可以随意指向任意字符串;

     

    数组表示字符串

    /1/同一操作系统下,数组所占内存空间不是固定的,可以人为变大变小;

    /2/用数组表示字符串,数组定义的字符串是可以改变的,通常用字符串处理函数

      strcpy(char*, const char *)来改变数组存储的字符串,并且字符串既存在常量区,也存在栈区。

     

     

    下面举个例子来具体说明两者的区别:

    #include <stdio.h>

    #include<string.h>

     

    intmain(int argc, const char * argv[]) {

    char arr[] ="123";

    char *p ="123";

    printf("%p\n%p\n",arr,p);

    printf("%s\n%s\n",arr,p);

    printf("%p\n%p\n",&arr,&p);

    printf("====================\n");


    strcpy(arr,"456");            //改变数组arr存储的字符串;

    p = "456";                       //改变指针p指向的字符串;

    printf("%p\n%p\n",arr,p);

    printf("%s\n%s\n",arr,p);

    printf("%p\n%p\n",&arr,&p);

     

    return 0;

    }

     

    打印结果:

    0x7fff5fbff7dc         //数组arr的地址;

    0x100000f6c   //指针p指向常量区“123”的地址;

    123  //“123”存在栈区数组arr内,但实际是从常量区复制过来的,可以改变;

    123   //“123”存在常量区,不可改变;

    0x7fff5fbff7dc // 数组arr的地址;

    0x7fff5fbff7d0 // 指针p的地址,存在栈区;

    ====================【下释义同上】

    0x7fff5fbff7dc

    0x100000f94

    456

    456

    0x7fff5fbff7dc

    0x7fff5fbff7d0



    展开全文
  • 在C语言中,可以用两种方法访问一个字符串。 一、用字符数组存放一个字符串,然后输出该字符串。 【例10.24】 main(){  char string[]=”I love China!...二、用字符串指针指向一个字符串。 【例10
    在C语言中,可以用两种方法访问一个字符串。
    

    一、用字符数组存放一个字符串,然后输出该字符串。

    【例10.24】
    main(){
      char string[]=”I love China!”;
      printf("%s\n",string);
    }

    说明:和前面介绍的数组属性一样,string是数组名,它代表字符数组的首地址。

    二、用字符串指针指向一个字符串。

    【例10.25】
    main(){
      char *string=”I love China!”;
      printf("%s\n",string);
    }


    字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。对指向字符变量的指针变量应赋予该字符变量的地址。如:

        char c,*p=&c;
    表示p是一个指向字符变量c的指针变量。而:
        char *s="C Language";
    则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。

    上例中,首先定义string是一个字符指针变量,然后把字符串的首地址赋予string(应写出整个字符串,以便编译系统把该串装入连续的一块内存单元),并把首地址送入string。程序中的:
        char *ps="C Language";
    等效于:
        char *ps;
        ps="C Language";

    【例10.26】输出字符串中n个字符后的所有字符。
    main(){
      char *ps="this is a book";
      int n=10;
      ps=ps+n;
      printf("%s\n",ps);
    }

    运行结果为:
        book
    在程序中对ps初始化时,即把字符串首地址赋予ps,当ps= ps+10之后,ps指向字符“b”,因此输出为"book"。

    【例10.27】在输入的字符串中查找有无‘k’字符。
    main(){
      char st[20],*ps;
      int i;
      printf("input a string:\n");
      ps=st;
      scanf("%s",ps);
      for(i=0;ps[i]!='\0';i++)
        if(ps[i]=='k'){
           printf("there is a 'k' in the string\n");
           break;
        }
      if(ps[i]=='\0') printf("There is no 'k' in the string\n");
    }

    【例10.28】本例是将指针变量指向一个格式字符串,用在printf函数中,用于输出二维数组的各种地址表示的值。但在printf语句中用指针变量PF代替了格式串。 这也是程序中常用的方法。
    main(){
      static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
      char *PF;
      PF="%d,%d,%d,%d,%d\n";
      printf(PF,a,*a,a[0],&a[0],&a[0][0]);
      printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);
      printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);
      printf("%d,%d\n",a[1]+1,*(a+1)+1);
      printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));
    }

    【例10.29】本例是把字符串指针作为函数参数的使用。要求把一个字符串的内容复制到另一个字符串中,并且不能使用strcpy函数。函数cprstr的形参为两个字符指针变量。pss指向源字符串,pds指向目标字符串。注意表达式:(*pds=*pss)!=`\0'的用法。
    cpystr(char *pss,char *pds){
      while((*pds=*pss)!='\0'){
          pds++;
          pss++; }
     }
    main(){
      char *pa="CHINA",b[10],*pb;
      pb=b;
      cpystr(pa,pb);
      printf("string a=%s\nstring b=%s\n",pa,pb);
    }

    在本例中,程序完成了两项工作:一是把pss指向的源字符串复制到pds所指向的目标字符串中,二是判断所复制的字符是否为`\0',若是则表明源字符串结束,不再循环。 否则,pds和pss都加1,指向下一字符。在主函数中,以指针变量pa,pb为实参,分别取得确定值后调用cprstr函数。由于采用的指针变量pa和pss,pb和pds均指向同一字符串,因此在主函数和cprstr函数中均可使用这些字符串。也可以把cprstr函数简化为以下形式:
         cprstr(char *pss,char*pds)
          {while ((*pds++=*pss++)!=`\0');}
        即把指针的移动和赋值合并在一个语句中。 进一步分析还可发现`\0'的ASCⅡ码为0,对于while语句只看表达式的值为非0就循环,为0则结束循环,因此也可省去“!=`\0'”这一判断部分,而写为以下形式:
          cprstr (char *pss,char *pds)
          {while (*pdss++=*pss++);}
    表达式的意义可解释为,源字符向目标字符赋值,移动指针,若所赋值为非0则循环,否则结束循环。这样使程序更加简洁。

    【例10.30】简化后的程序如下所示。
    cpystr(char *pss,char *pds){
        while(*pds++=*pss++);
    }
    main(){
      char *pa="CHINA",b[10],*pb;
      pb=b;
      cpystr(pa,pb);
      printf("string a=%s\nstring b=%s\n",pa,pb);
    }
    展开全文
  • 指针字符串

    千次阅读 2020-02-27 17:11:08
    指针字符串 2.1指针的使用 函数返回多个值,通过指针返回结果,指针作为形式参数 2.1.1.c 函数返回运算状态,结果通过指针返回。即C语言中的try/catch 2.1.2.c 指针在使用之前一定要初始化,赋予...

    指针与字符串

    2.1指针的使用

    • 函数返回多个值,通过指针返回结果,指针作为形式参数 2.1.1.c

    • 函数返回运算状态,结果通过指针返回。即C语言中的try/catch 2.1.2.c

    • 指针在使用之前一定要初始化,赋予指针变量地址

    • 对数组进行操作

    • 动态申请内存空间

    指针与数组

    • 数组变量是特殊的指针

      //以下四中函数原型是等价的  数组名即为数组首地址是特殊的指针
      int sum(int *array, int n);
      int sum(int *, int);
      int sum(int array[], int n);
      int sum(int [], int);
      ​
      int array[5]; // array ==  &array[0]

       

    • 数组变量是const类型的指针,不可以被改变,不能被赋值

    指针与const

    • const指针,int * const p ;与数组变量类似,表示一旦得到了某个变量地址,不能再指向其他变量,即不能作为游标来扫描。(指针不可修改)

    • const int *p;或者int const *p表示不能通过该指针去修改这个变量,*p是const不可修改。(通过指针不可修改)

    • const int a[5]; const数组,数组元素不可修改

    2.2指针的计算

    • 指针计算:对应地址空间(地址块为单位移动)

    • 指针可以进行的运算:

      1. 指针加或减一个整数

      2. 递增递减 ++/--

      3. 两个指针相减(得到sizeof的个数)

    • *p++用于地址空间遍历:2.2.1.c

      1. *p++的含义:取出p所指的内容,并移到下一个位置

      2. ++的优先级高于*

      3. 常用于连续地址空间的遍历

    • 0地址,不可使用的地址一般编译器中用NULL表示

    动态内存分配malloc free 2.2.2.c

    • malloc申请内存空间的大小是以字节为单位的

    • malloc返回的结果是void*类型的,使用时需要进行类型转换

    • malloc申请空间失败会返回NULL

    • free只能用于malloc申请来的地址,地址被修改后无法free

    2.3字符串操作

    • putchar(),getchar():在保准输入输出读写单个字符

    • 字符串数组:

      1. char **a:a是一个指针,指向另一个指向字符(串)的指针

      2. char a[][]:a是一个字符二位数组

      3. char *a[]:a是一个指针数组,数组元素都是指向另一个字符串的指针

    • int main(int argc, int const *argv[]):argv[0]是命令本身,后续为符号链接的名字(额外学习busybox

    • 字符串函数:#include <string.h>: strlen(); strcmp(); strcpy();

    2.4函数的指针

    • 指向函数的指针:void (*pf)(int) = f;

    • 根据用户输入决定调用的目标函数2.4.1.c

      int i = 0;
      void (*fa[])(int) = {f,g,h,k};
      scanf("%d",&i);
      if(i>=0 && i<sizeof(fa)/sizeof(fa[0])){
          (*fa[i])(0);
      }

       

    涉及代码已经上传至Github 

    展开全文
  • 字符指针字符串

    千次阅读 多人点赞 2016-10-11 11:33:57
    1.字符指针可以指向一个字符串。 我们可以用字符串常量对字符指针进行初始化。例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即...

    1.字符指针可以指向一个字符串。

    我们可以用字符串常量对字符指针进行初始化。例如,有说明语句:

    char *str = "This is a string.";

    是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。

    这里要注意字符指针与字符数组之间的区别。例如,有说明语句:

    char string[ ]="This is a string.";

    此时,string是字符数组,它存放了一个字符串。

    字符指针str与字符数组string的区别是:str是一个变量,可以改变str使它指向不同的字符串,但不能改变str所指的字符串常量。string是一个数组,可以改变数组中保存的内容。

    2.实例:

    char *str, *str1="This is another string.";

    char string[100]="This is a string.";

    则在程序中,可以使用如下语句:

    str++; /* 指针str1 */

    str = "This is a NEW string."; /* 使指针指向新的字符串常量 */

    str = str1; /* 改变指针str的指向 */

    strcpy( string, "This is a NEW string.") /* 改变字符串的的内容 */

    strcat( string, str) /* 进行串连接操作 */

    在程序中,不能进行如下操作:

    string++; /* 不能对数组名进行++运算 */

    string = "This is a NEW string."; /* 错误的串操作 */

    string = str1; /* 对数组名不能进行赋值 */

    strcat(str, "This is a NEW string.") /* 不能在str的后面进行串连接 */

    strcpy(str, string) /* 不能向str进行串复制 */

    3.其它说明:

    1) 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写:"abc",那么编译器帮你存储的是"abc\0"

    2) "abc"是常量吗?答案是有时是,有时不是。

      不是常量的情况"abc"作为字符数组初始值的时候就不是,如

                      char str[] = "abc";

    因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc",而又因为字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为 char str[3] = {'a','b','c'};又根据上面的总结1,所以char str[] = "abc";的最终结果是 char str[4] = {'a','b','c','\0'};

     做一下扩展,如果char str[] = "abc";是在函数内部写的话,那么这里的"abc\0"因为不是常量,所以应该被放在栈上。

     是常量的情况:  "abc"赋给一个字符指针变量时,如

                      char* ptr = "abc";

     因为定义的是一个普通指针,并没有定义空间来存放"abc",所以编译器得帮我们找地方来放"abc",显然,把这里的"abc"当成常量并把它放到程序的常量区是编译器最合适的选择。所以尽管ptr的类型不是const char*,并且ptr[0] = 'x';也能编译通过,但是执行ptr[0] = 'x';就会发生运行时异常,因为这个语句试图去修改程序常量区中的东西。

    记得哪本书中曾经说过char* ptr = "abc";这种写法原来在c++标准中是不允许的,但是因为这种写法在c中实在是太多了,为了兼容c,不允许也得允许。虽然允许,

    但是建议的写法应该是const char* ptr = "abc";这样如果后面写ptr[0] = 'x'的话编译器就不会让它编译通过,也就避免了上面说的运行时异常。

    又扩展一下,如果char* ptr = "abc";写在函数体内,那么虽然这里的"abc\0"

    放在常量区中,但是ptr本身只是一个普通的指针变量,所以ptr是被放在栈上的只不过是它所指向的东西被放在常量区罢了。

    3) 数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的。如char s1[3]char s2[4]s1的类型就是char[3]s2的类型就是char[4]

    也就是说尽管s1s2都是字符数组,但两者的类型却是不同的。

    4) 字符串常量的类型可以理解为相应字符常量数组的类型,

      "abcdef"的类型就可以看成是const char[7]

    5) sizeof是用来求类型的字节数的。如int a;那么无论sizeof(int)或者是sizeof(a)都是等于4,因为sizeof(a)其实就是sizeof(type of a)

    6) 对于函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通的指针类型,如对于void func(char sa[100],int ia[20],char *p)

      sa的类型为char*ia的类型为int*p的类型为char*

    7) 根据上面的总结,来实战一下:

     对于char str[] = "abcdef";就有sizeof(str) == 7,因为str的类型是char[7]

     也有sizeof("abcdef") == 7,因为"abcdef"的类型是const char[7]

     对于char *ptr = "abcdef";就有sizeof(ptr) == 4,因为ptr的类型是char*

     对于char str2[10] = "abcdef";就有sizeof(str2) == 10,因为str2的类型是char[10]

      对于void func(char sa[100],int ia[20],char *p);

      就有sizeof(sa) == sizeof(ia) == sizeof(p) == 4

      因为sa的类型是char*ia的类型是int*p的类型是char*

    4.区别:

    (1)字符数组由若干个元素组成,每个元素中存放字符串的一个字符,而字符指针变量中存放的是字符串的首地址。

    (2)初始化方式不同。对字符数组初始化要用static存储类别,在编译时进行。而对字符指针变量初始化不必加static,在实际执行时进行。

    (3)赋值方式不同。对字符数组不能整体赋值,只能转化成份量,对单个元素进行。而字符指针变量赋值可整体进行。

    例如:

    char s[10]

    s= \"C++\"/*错,s是常量,怎能被赋值*/

    (4)在定义一个字符数组时,编译时即已分配内存单元,有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,但该指针变量具体指向哪个字符串,并不知道,即指针变量存放的地址不确定。例如:

    char a[10];
    char *p;
    scanf(\"%s\"
    s);/*正确*/

    scanf(\"%s\"p)/*非常危险,p的值动态*/

    (5)字符指针变量的值可以改变,字符数组名是一个常量,不能改变。例如,有简单程序:

    main()

    {

    char s=\"china man\"

    s+=6

    printf(\"%s\"s);

    }
    运行结果:man

    展开全文
  • 指针字符串常量

    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”...
  • 指针字符串指针与函数

    千次阅读 2018-11-21 09:51:35
    标题1、 指针字符串的千丝万缕 由于在C语言中,是通过字符数组来存储字符串的,因而前面通过指针对一维数组和二维数组的操作方法,同样适用于字符串。其实,对字符串的操作最好采用字符串操作函数。 #include&...
  • 使用指针实现字符串复制

    千次阅读 2014-12-07 17:17:52
    使用指针实现字符串复制
  • 通过实例来理解表示方法的含义。源代码如下图所示。注视掉的前两行,要是释放了,编译之后会报错...写法上像是把一串字符赋值给了 *s1 一样。但是赋值时的 * 表示 s1 的类型。赋值语句的含义: s1 = "hello kitty."...
  • c语言指针实现字符串拼接

    千次阅读 2019-05-17 21:05:04
    突然想使用c指针语言实现实现字符串的拼接 以下是代码实现 #include<stdio.h> #include<string.h> #include<malloc.h> int main() { int before=0; int after=0; char*newStr=NULL; char*...
  • C语言值指针\字符串字符串查找

    千次阅读 2018-05-29 21:01:46
    隐式转换的原则:向表示范围大的...所有字符串都是以\0结束;字符串可以用char *a="hello";char str[6]="hello",char str[]="hello";char str[6]={‘h’,‘e’,‘l’,‘l’,‘o...
  • C语言基础——字符串指针(指向字符串指针

    万次阅读 多人点赞 2018-07-25 09:57:15
    C语言中没有类似java,python等面向对象的编程语言中string那样的特定的字符串类型,通常是将字符串放在一个字符数组中。 遍历字符串代码: #include&lt;stdio.h&gt; #include&lt;string.h&gt; ...
  • 指针字符串_基础知识

    千次阅读 2017-12-06 11:13:43
    一、char类型的长度为1,而字符串字面量的长度为4 printf("%d\n", sizeof(char));//1 printf("%d\n", sizeof('a'));//4 二、字符串字面量看作常量,无法修改字符串。 #include<stdio.h> int main() { ...
  • 字符指针字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。 char *ps=&quot;C Language&quot;; 顺序是:1....
  • 指针和数组是不相等的,把一个数组名作为一个参数传递给函数时数组名就是指向第一个元素的指针,在大多数表达式中 数组名的值是指向第一个元素的指针(有两个例外,一个是sizeof返回的是整个数组的字节数,一个是&...
  • C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在《C语言字符数组和字符串》中已经进行了详细讲解,这里不妨再来演示一下: #include <stdio.h>int main(){ char str[] = ...
  • 字符串指针

    千次阅读 2015-06-22 23:57:41
    字符串指针  1)字符串指针  a、在C语言中,可以用两种方法访问一个字符串  ①字符数组  ②字符串指针指向字符串  char *变量名="字符串内容"; //"字符串内容"是常量  字符串指针变量的定义说明与指向字符变量...
  • 数组不是基本类型,不能直接参与比较,数组与字符串及字符指针字符串比较其实比较的是二者的地址。 例: int isequiv(char *t) { if (t == "char") return 1; else return 0; } int main() { char test[] = "char...
  • 一、字符串指针 C语言中没有特定的字符串类型,通常是将字符串放在一个字符数组中,这里不妨演示一下: #include <stdio.h> #include <string.h> int main() { char str[] = ...
  • 字符串字符数组实际上是一系列字符的集合,也就是字符串(String)。 字符串数组在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串。C语言规定,可以将字符串直接赋值给字符...
  • 1、 字符串表示形式在C语言中,我们可以用两种方式访问字符串 (1) 用字符数组存放一个字符串,然后输出该字符串。 main(){  charstring[]="I love China!";  printf("%s\n",string); } (2) 用字符指针...
  • 字符串与字符数组 字符串一定是一个char的数组,但char的数组未必是字符串。——以字符’\0’结尾的char数组就是一个字符串,但如果char数组没有以’\0’结尾,那么就不是一个字符串,只是普通字符数组,所以字符串...
  • 圳 职 业 技 术 学 院Shenzhen Polytechnic 七单元3字符串指针 教学内容 字符串的指针和指向字符串的指针变量 教学目标 应知 字符串可以用字符数组和字符指针表示 应会 用字符指针表示字符串用字符串指针作函数参数...
  • 一:数组指针的定义方法 1.int a[10] = {1,2,3,4,5,6,7,8,9,0}; int * p; p = &amp;a[0]; // 等价于p = a;...123二:输入字符串的方法1.直接把字符串输入到字符数组char str[] = "I l...
  • 问题描述:有一个用字符指针表示字符串char *str = "0 12"; 有一个数组 char buf[128] = {0}; 现在需要将字符指针表示字符串"0 12",放入到数组buf中。 一、首先了解一下字符串的表示方式,即c语言中怎样定义...
  • c语言 如何用指针来处理字符串

    万次阅读 多人点赞 2016-12-09 20:48:06
    1字符指针输出字符串 2字符指针处理字符串 3字符数组与字符指针处理字符串有何不同 二指针数组读者,你好! 如果你精通C,希望能得到你的斧正;如果你是初学者,希望能对你有所帮助。 加粗的是一些我认为比较重要...
  • C语言程序设计 第10章 指针 第3讲字符串指针和指向字符串指针变量 ...字符串表示方法 C语言程序设计 字符数组实现 字符指针实现 运行结果 语句编写 main) { } char string[20]="I love China; printf%s\n,str
  • C语言之字符串表示方式

    千次阅读 2016-04-19 13:41:23
    2. 字符指针表示字符串 从编译器角度分析: 例如:char *p = "linux" ; p是字符指针,"linux" 字符串本身,当编译器遇到这种字符串表示时,会将指针和字符串本身分开处理, 字符指针p是一个变量,将其放在栈上,而...
  • C语言之指针字符串的相关操作

    千次阅读 2014-12-11 12:07:03
    一、指针 指针是一种数类型     1) 指针也是一种变量,占有内存空间,用来保存内存地址 测试指针变量占有内存空间大小 //char *p1 形参 形参也是被调用该函数的参数,只不过具有对外属性而已。 voidgetData01...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 361,066
精华内容 144,426
关键字:

指针表示字符串