C语言字符串指针

Posted 张某人ER

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言字符串指针相关的知识,希望对你有一定的参考价值。

原文地址:http://c.biancheng.net/cpp/html/80.html


在C语言中,可以通过字符数组存放一个字符串,也可以用字符指针指向一个字符串。


【示例】用字符数组存放一个字符串,然后输出该字符串。
#include <stdio.h>
int main()
    char string[] = "I love China!";
    printf("%s\\n", string);

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

【示例】用字符串指针指向一个字符串。
#include <stdio.h>
int main()
    char *string = "I love China!";
    printf("%s\\n", string);

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

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

【示例】输出字符串中n个字符后的所有字符。
#include <stdio.h>
int main()
    char *ps = "This is a good tutorial!";
    int n=10;
    ps=ps+n;
    printf("%s\\n", ps);
    return 0;
运行结果为:
good tutorial!

在程序中对ps初始化时,把字符串首地址赋予ps,当ps= ps+10之后,ps指向字符 'b' ,因此输出为 "good tutorial!"。

【示例】在输入的字符串中查找有无‘k’字符。
#include <stdio.h>
int main()
    char str[20], *ps;
    int i;
    printf("Input a string: ");
    ps = str;
    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");

    return 0;
运行结果:
Input a string: thank you
There is a 'k' in the string!

【示例】不使用 strcpy 函数实现字符串的复制。
#include <stdio.h>

void cpystr(char *pss, char *pds)
    while((*pds=*pss)!='\\0')
        pds++;
        pss++;
    


int main()
    char *pa = "Apple, Samsung, Xiaomi, Smartisan", b[100], *pb;
    pb=b;
    cpystr(pa, pb);
    printf("string a=%s\\nstring b=%s\\n",pa, pb);

    return 0;
运行结果:
string a=Apple, Samsung, Xiaomi, Smartisan
string b=Apple, Samsung, Xiaomi, Smartisan

函数 cprstr 的形参为两个字符指针变量,pss 指向源字符串,pds 指向目标字符串。注意表达式 (*pds=*pss)!=`\\0' 的用法。

本例中程序完成了两项工作:一是把pss指向的源字符串复制到pds所指向的目标字符串中,二是判断所复制的字符是否为`\\0',若是则表明源字符串结束,不再循环。否则,pds和pss都加1,指向下一字符。

在主函数中,以指针变量pa、pb为实参,分别取得确定值后调用cprstr 函数。由于采用的指针变量pa和pss、pb和pds均指向同一字符串,因此在主函数和cprstr函数中均可使用这些字符串。也可以把cprstr函数简化为以下形式:
void cprstr(char *pss,char*pds)
    while( (*pds++=*pss++) != '\\0' );
即把指针的移动和赋值合并在一个语句中。 进一步分析还可发现 `\\0' 的ASCII码为0,对于while语句只看表达式的值为非0就循环,为0则结束循环,因此也可省去 !='\\0' 这一判断部分,而写为以下形式:
void cprstr(char *pss,char*pds)
    while(*pds++ = *pss++);

表达式的意义可解释为,源字符向目标字符赋值,移动指针,若所赋值为非 0 则循环,否则结束循环。这样使程序更加简洁。



补充:

 char **  与char  * a[ ] ;

            先看 char  *a [ ] ;

            由于[ ] 的优先级高于* 所以a先和 [ ]结合,他还是一个数组,数组中的元素才是char * ,前面讲到char * 是一个变量,保存的地址。。

            所以 char *a[ ] = "China","French","America","German";

            同过这句可以看到, 数组中的元素是字符串,那么sizeof(a) 是多少呢,有人会想到是五个单词的占内存中的全部字节数 6+7+8+7 = 28;

            但是其实sizeof(a) = 16;

            为什么,前面已经说到, 字符串常量的本质是地址,a 数组中的元素为char * 指针,指针变量占四个字节,那么四个元素就是16个字节了

            看一下实例:

            #include <stdio.h>

   int main()
   
    char *a [ ] = "China","French","America","German";
    printf("%p %p %p %p\\n",a[0],a[1],a[2],a[3]);

    return 0;
   

    

      可以看到数组中的四个元素保存了四个内存地址,这四个地址中就代表了四个字符串的首地址,而不是字符串本身。。。

      因此sizeof(a)当然是16了。。

      注意这四个地址是不连续的,它是编译器为"China","French","America","German" 分配的内存空间的地址, 所以,四个地址没有关联。



以上是关于C语言字符串指针的主要内容,如果未能解决你的问题,请参考以下文章

C语言13-指针和字符串

C语言:用指针实现字符串大小的比较,应该怎样做呢?

ZZNUOJ_用C语言编写程序实现1160:字符串长度(指针专题)(附完整源码)

请问c语言中用字符数组怎么判断输入的一串数字是大于等于或者小于0呢

snprintf不能使用"字符串指针"赋值,可以使用字符数组

C 语言指针