C语言字符和字符串随记

==========================
第11章 字符和字符串函数
==========================
震惊:
字符串常量属于静态存储类,常量引号中的内容作为指向该字符串存储位置的指针:
printf("%s, %p, %c ","we","are",*"young!");语句执行的结果如下:
we, 0x4005e4, y

字符串的数组声明:
char str[] = "string A";  <=>  char[] str = {'s','t','r','i','n','g',' ','A',''};
注意右边的声明最后需要加上‘’标志,如果不加,得到的就是一个字符数组而不是字符串
但实验证实不加的话,以'%s'的方式仍然能够输出,不会多输出;
根据上面条件,有下面等式成立:
str == &str[0],    *str == str[0] =='s',    *(str+1) == str[1] =='t'
本质仍是数组,所以指针的一套可以用:
char str[] = "String A!";        <=>    char *ptr = "String A!";
这个不能进行++str操作,可进行*(str+i)操作      而这个可以进行++str操作,也可进行ptr[i]操作
本质原因前者是地址常量,后者是指针变量

数组初始化是从静态存储区把一个字符串复制给数组,而指针初始化只是将字符串的地址赋值给指针变量
============================================================
#include <stdio.h>
int    main(void)
{
    char *ptr = "String";
    //ptr[0] = 'A';        //编译器偷懒可能导致String只有一个拷贝,公用品不能单改
    printf("String ");
    printf("%s %s ",ptr,"String");
    return 0;
}
============================================================

char *str[5]    约等于    char[X][5],两者用法大致相同,但存储原理不同

gets()函数不会检查输入是否大于分配的存储空间,所以更安全的做法是使用fgets()函数,但也更麻烦。



不加换行符的puts()代码;
void putss(const char * string)
{
    while(*string!='')    //如用while(*string),也可,最简洁,略有不同
        putchar(*string++);
}

void putss(const char * string)
{
    int i = 0;
    while(string[i]!='')
        putchar(string[i++]);
}

原文地址:https://www.cnblogs.com/Zbtrik/p/3913574.html