天天看点

C语言学习篇-10指针与字符串、函数指针

说明:本文主要阐述字符串、指针与字符串、函数指针以及指向指针的指针

字符串

1.字符串:由数字、字母、下划线组成的一串字符。是表示文本的数据类型。以\0结尾。

2.输出时字符串所用的格式符为“%s”。

3.字符串的三种写法:

Char name[8]=“yang”;//数组占用了8个字节的存储空间,但是只含有5个字符。
Char name[8]={‘y’+‘a’+‘n’+‘g’+‘\o’};
Char name[8]={‘y’+‘a’+‘n’+‘g’+‘0’};
           

4.在C语言中,我们可以用两种方式访问字符串。

  • 用字符数组存放一个字符串,然后输出该字符串。
#include <stdio.h>

int main() {

    char string[]="I love C language!";

    printf("%s\n", string);

    return ;
}
           
  • 用字符指针指向一个字符串。可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。
#include <stdio.h>

int main() {

    char *string="I love C language!";

    printf("%s\n", string);

    return ;
}
//没有定义字符数组,而是在程序中定义了一个字符指针变量string,用字符串常量"I love C language!",对它进行初始化。
           

C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来才存放该字符串常量。对字符指针变量初始化,实际上是把字符串第1个元素的地址(即存放字符串的字符数组的首元素地址)赋给string。

5.使用注意

  • “\0”的作用
#include <stdio.h>

int main() {

    char *string="I love C lan\0guage!";//打印I love C lan

    printf("%s\n", string);

    return ;
}
           

6.strlen函数

strlen函数计算字符串的长度(字符数)但不包括\0,是字符数不是字数。

  • strlen(“cccc”);//长度为4
  • strlen(“c语言”);//长度为7而不是3,一个汉字占三个字符。
#include <stdio.h>

int main() {

    char name[] = "it\0test";

    printf("%lu\n",strlen(name));

    return ;
}
           

打印结果值为2,因为strlen从字符串的地址开始计算,直到遇到\0为止。

7.二维字符数组

存储两个字符串数组,下面是两种写法但存储情况是一样的。

Char name[2][10]={“jack”,“rose”};

Char name2[2][10]={
                  {‘j’+‘a’+‘c’+‘k’+‘\0’},
                  {‘r’+‘o’+‘s’+‘e’+‘\0’}}
           

函数指针

1.函数指针:指向函数的指针变量。

对于一个函数而言,函数名也是指向函数第一条指令的常量指针。而编译器要做的就是在程序编译之后,为每个函数分配一个首地址,即该函数第一条指令的地址。一般情况下,我们可以用一个指针来保存这个地址,而这个指针就是函数指针,该指针可以看作是它指向函数的别名,所以我们可以用该指针来调用这个函数。

2.如何声明?

格式:返回值类型(*函数名)(参数)

示例

int (*p)(int x,int y);//定义了一个p指针,指向了一个函数,这个函数带有两个int类型参数,函数的返回值为int类型

3.如何使用?

示例:

#include <stdio.h>

int maxValue(int x,int y){
    return x > y ? x : y;
}

int main() {

    int a = , b = ;

    int (*p)(int a,int b) = maxValue;

    int max = p(a,b);

    printf("%d\n",max);

    return ;
}
           

4.使用注意

  • 指针类型必须与指向的数据的类型匹配,函数有类型,函数指针必须和函数的类型保持一致。
int (*p)(int x,int y);//p指针类型为int (*)(int,int)
           
  • 一个指向函数的指针必须确保该函数被定义且分配了内存,否则它将指向一个空地址。
  • 特别需要注意第一个括号。
int *p(int x,int y);//这不是一个指向函数的指针,而是声明了一个函数,该函数返回一个int类型指针。
           

总结

1.strlen函数计算字符串的长度(字符数)但不包括\0;

2.函数指针的类型必须与所指向的函数类型一致。

练习

1.编写一个函数char_contains(char str[],char c),如果字符串中包含字符c,则返回1,否则返回0,并在main函数中使用函数指针调用。答案

继续阅读