字符指针

2019-8-9字符指针

①字符指针:指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。即将字符串的首地址赋值给字符指针,可让字符指针指向一个字符串。

char *ptr = "Hello";//将保存在常量存储区的"Hello"的首地址赋值给ptr
与
char *ptr;
ptr = "Hello";//是等价的,注意不能理解为将字符串赋值给ptr

char str[10] = "Hello";
char *ptr = str;//数组名代表数组的首地址
//等价于
 char *ptr;
 ptr = str;//等价于ptr = &str[0];将数组的首地址赋给字符指针ptr

④对于数组名str,不能使用str++操作使其指向字符串中的某个字符,因为数组名是一个地址常量,其值是不能被改变的。

*(ptr+i):字符串中第i+1个字符,相当于*(str+i),即str[i]
也可以用ptr++,移动指针ptr,使ptr指向字符中的某个字符

⑤字符串的长度(指字符串所含的字符个数,但不包括最后的’\0’)与字符数组的大小(指字符串所包含的字符个数加上’\0’,故+1)不一样。

for(i = 0;str[i] != '\0'; i++ )
{
     printf("%c",str[i]);//常用借助字符串结束标志'\0'识别字符串的结束
}
scanf("%s",str);//表示读入一个字符串,直到遇到空白字符(空格、回车符、制表符)为止
//如果输入带有空格的字符串(比如人名)只会读到空格以前而空格以后不会读入,留在了输入缓冲区中
printf("%s",str);//表示输出一个字符串,直到遇到字符串结束标志'\0'为止(注意这里可以带有空格输出)

gets():可以输入带有空格的字符串。以回车符作为字符串的终止符,同时将回车符从输入缓冲区读走,但不作为字符串的一部分。而scanf()不读走回车符,回车符仍留在输入缓冲区中。 gets()不能限制输入字符串的长度,很容易引起缓冲区溢出。同样即使scanf(“12s%”,name)也不能解决这个问题。当使用scanf()和gets()时,确保输入字符串的长度不超过数组的大小,否则使用限制输入字符串长度的函数fgets(name,sizeof(name),stdin)
puts():用于从括号内的参数给出的地址开始,依次输出存储单元中的字符,当遇到第一个’\0’时输出结束,并且自动输出一个换行符’\n’

#include 
#define N 12
int main()
{
    char name[N];
    char *ptrName = name;//声明一个指向数组name的字符指针ptrName
    //注意这里,用字符指针输入字符串前提,必须保证字符指针事先已指向一个数组的首地址,如ptrName指向了数组name,如果只是单纯声明字符指针,编译会报错
    printf("Enter your name:");
    gets(ptrName);//输入字符串存入字符指针ptrName所指向的内存
    //为提高程序安全性,也可以使用fgets(name,sizeof(name),stdin);
    printf("Hello %s!\n",ptrName);
    return 0;
}

⑥if(str1==str2)时合法语句,比较这两个地址的大小(作为指针,有不同的地址,一定为假),而不是比较字符串的大小,也不是比较字符串的内容。
函数功能:用字符指针作为函数参数,实现字符串复制(将str2复制到str1中)

void MyStrcpy(char *str1,char *str2)
{
        while(*str2!='\0')//若当前str2所指字符不是字符串结束标志
        {
           *str1 = *str2;//复制字符
            str2++;//使str2指向下一个字符
            str1++;//使str1指向下一个存储单元
        }
        *str1 = '\0';//当复制循环结束时,在str1的末尾添加字符串结束标志
}

函数功能:用字符型数组作函数参数,计算字符串的长度

unsigned int MyStrlen(const char str[])
{
           int i;
           unsigned int len = 0;//计数器设置为0
           for(i=0;str[i]!='\0';i++)
           {
                len++;//循环统计不包括'\0'在内的字符个数
           }
           return len;
}

函数功能:用字符指针作函数参数,计算字符串的长度

unsigned int MyStrlen(const char *pStr)//为防止实参在被调函数中被意外修改,在相应的形参前面加上类型限定符const
{
           unsigned int len = 0;//计数器设置为0
           for(;*pStr !='\0';pStr++)
           {
                len++;//循环统计不包括'\0'在内的字符个数
           }
           return len;
}

补充:
int型变量范围:-2147483648~2147483647
unsigned int型变量范围:0~4294967295
从函数返回字符串指针
函数功能:将字符串str2连接到字符串str1的后面

char *MyStrcat(char *str1,char *str2)
{
      char *pStr = str1;//定义一个字符指针并保存字符串str1的首地址
      while(*str1! = '\0')//当没有读到str字符串的结束标志
      {
            str1++;//将指针移动到字符串str1的末尾
      }//注意这里,在读到'\0'之前时,指针已经移到了这个位置,当读到时跳出循环不再指向下一个
      所以复制str2的首地址是'\0'之前的位置
      for(;*str2!='\0';str1++,str2++)
      {
            *str1 = *str2;//将字符串str2复制到字符串str1的后面
      }
            *str1 = '\0';//在连接后的字符串的末尾添加字符串结束标志
            return pStr;//返回连接后的新的字符串str1的首地址
}

char *f(); 声明的是一个返回字符指针的函数f()。如上代码
char(*f)(); 函数指针f。指向的函数没有形参,返回值是字符型。f是一个指针,表示该指针变量可以指向一个返回值为字符型的函数

⑦const类型限定符
数据传到被调函数内部,不希望其在函数内部被修改,防止数据被意外修改,用const对参数进行限定
⑧字符处理函数

函数原型 功能描述
int isdigit(int c); 判断是否为数字,返回真假值
int isalpha(int c); 判断是否为字母,返回真假值
int isalnum(int c) 判断是否为字母或者数字,返回真假值
int islower(int c) 判断是否为小写字母,返回真假值
int isupper(int c) 判断是否为大写字母,返回真假值
int tolower(int c) 若c是大写字母,将c转换成小写字母后返回
int toupper(int c) 若c是小写字母,将c转换成大写字母后返回
int isspace(int c) 若c是空白符(换行符(’\n’)、空格符(’ ‘)、换页符(’\f’)、回车符(’\r’)、水平(’\t’)、垂直制表符(’\v’)),返回真值
int iscntrl(int c) 若c是控制字符(水平、垂直制表符、换页符、响铃报警符(’\a’)、退格符(’\b’)、回车符、换行符),返回真值
int isprint(int c) 若c是一个包含空格在内的可打印字符,返回真值
int isgraph(int c) 若c是一个除空格以外的所有可打印字符,返回真值

你可能感兴趣的:(C语言)