C语言基础(3)——函数的调用和指针

本节内容

  • 1.头文件
  • 2.实现文件
  • 3.什么是指针
  • 4.指针的类型
  • 5.指针和数组
  • 6.指针和函数
  • 7.指针实战——字符串的查找

(一)头文件

头文件一般用""或<>框起来,如果是系统自带的功能函数,那么就用<>。如果是我们自己定义的函数,那么就使用""。
在头文件中我们一般只进行函数的声明,不包含代码块,无{}。头文件的下标一般为.h
例如以下是计算器中的一个头文件:
#include<stdio.h>
//头文件里面声明函数
int add(int a,int b);//加法 
int minus(int a,int b);//减法 
int multiply(int a,int b);//乘法 
int devide(int a,int b);//除法

(二)实现文件

实现文件一般就是我们所说的源文件,在这里我们会写上函数的内容,明确该函数的任务。在这里我们会加上{},实现文件下标一般为.cpp。
例如一下为计算器中的一个实现文件:
#include"calculator.h"
add(int a,intb){
      return a+b;}
minus(int a,int b){
     return a-b;}
multiply(int a,int b){
     return a*b;}
devide(int a,int b){
     if(b==0){
          return 0;}
     else{return a/b;}

函数的实现

最后只需要在main函数前声明一下头文件,即#include"calculator.h"就可以正常使用了。例如:
#include<stdio.h>
#include"calculator.h"
int main(){
   printf("1+1=%d\n",add(1,1));
   printf("2-1=%d\n",minus(2,1));
return 0;}
注:在开发一个小程序或者是软件的时候,我们就需要分工合作,每个人写自己的功能函数,最后在main函数中实现。

(三)什么是指针

  • 指针的作用:如果希望在函数之间传递多个大于“1”的数给调用者,那么就必须使用指针。
  • 什么是指针:指针是一个变量,而且这个变量只能存放地址。指针变量占据“8”个字节空间。
  • *:(1)定义的时候这个符号表明是一个指针变量(2)使用的时候表明的是该地址所对应的值 ,但如果是%s,那么单一个p就表示所对应的值。不用加&
  • 注:如果只是声明一个指针变量,那么系统就不会分配内存空间。如果是定义一个变量并且要给它赋值,那么系统就要立刻分配内存空间。

(四)指针的类型

声明一个指针的格式一般为:int *p;(整型指针)char p;(字符指针)int ( * func)(int);(函数指针)等等。那么去掉一个星号和变量名就是指针的类型。如char * * p就是一个char类型的指针。
  • 指针变量只能指向同种数据类型的地址。例如整型指针只能指向整型变量的地址。
  • 指向一个普通变量:一级指针。指向一个地址:二级指针。
  • 普通指针变量:*p。
  • 常量指针:int const *pa=&50;常量指针不能改变指针指向的的变量的值,但是可以改变指向。如pa=&30;是正确的,但 *pa=30;时错误的。
  • 指针常量:指针常量就是数组,可以改变指针指向的变量的值,但是不能改变指向。int * const pb=&b;那么*pb=a;是正确的,但是 pb=&a;是错误的
  • 指向常量的常量指针:int const* const pb=&b;指针的指向和指针指向的变量的值都不能改变。

(五)指针和数组

首先定义一个数组 int num[5]={};那么数组名num就是数组的首地址。
  • 数组名本身没有分配内存空间
  • 如果使用sizeof函数,那么sizeof(num)就是计算整个数组的内存空间
  • 数组是一片连续的内存空间
  • 数组和指针的共同点:数组也可以用指针访问。如*(num+1)=30;指针里面如果不确定的话尽量加圆括号 用来分清结合方式。数组是一个指针常量,只能改变指向的值,不能改变指向。
  • int *a[10];这是一个指针数组,数组里面放的是整型指针

(六)指针和函数

  • 作用:通过指针简介访问某个内存
  • 定义一个函数,什么情况下参数是指针。这个函数会不会改变传递过来的数据本身。
  • 需要改变外部的值,就将这个值定义为指针变量
  • 定义一个指针函数:
void test(int *pa,int *pb){
(*pa)++;
(* pb)++;}
test(&a,&b);调用一个指针函数。
  • 函数接收数组时,必须知道数组元素的个数。
  • 函数里面通过指针变量来接收数组的地址。
  • 指针变量无法确定指向的内容大小。

(七)指针实战——字符串的查找

  • 项目内容:输入一组字符串,然后提示用户需要查找的字符串,程序自动打印出用户选择的字符串在该组字符串中出现的次数。
  • 在该程序中,我们需要调用函数,创建头文件和实现文件

(1)创建头文件

  • 首先我们创造一个头文件,我们需要先声明我们将使用的函数。一个是用来接收用户输入的myscanf函数和input函数,一个是接收用户输入字符串的长度的find 函数。
  • 注:如果调用的函数在使用的函数前面 就需要提前声明。如果是在后面,那么也可以不用另外声明。
  • 如果是定义一个字符串,就使用char*;
#include<stdio.h>

void input(char*p,char*des);
int find(char*sentence,char*word);
void myScanf(char*p);

(2)创建实现文件

  • 首先是myScanf函数,用来接收用户输入,用一个while循环,当遇到\n时就跳出。
#include"myString"
void myScanf(char*p){
  int i=0;
  while(1){
   char c=getchar();
      if(c='\n'){
       p[i]='\0';
       break;
    }
    p[i]=c;
     i++;
}
}
  • 然后是input函数,为了确保空格也能被输出来,所以我们要定义一个char*des来接收空格。
void input(char*p,char*des){
     printf("%s",des);
     myScanf(p);
}
  • 然后就是我们计算字符串长度的函数啦
int length(char *p){
    int i=0;
    while(1){
        if(p[i]=='\0'){
            break;
        }
        i++;
    }
    return i;
}
  • 然后我们需要使用find函数,来确定用户寻找的字符串在原字符串中出现的次数。首先得判断word与sentence的长度,如果前者大于后者,那么直接break;
int find(char *sentence,char *word){
    //1.获取两个字符串的长度,因为sentence是字符串,所以用char * 
    
     int slength=length(sentence);
     int wlength=length(word);
     //2.判断查询的字符串长度是否比句子短 
     if(slength<wlength){
        return 0;
     }
     int start=0;
     int count=0;
     for(int i=0;i<slength;i++){
        //记录当前start的位置 
        start=i;
        int j=0;
        for(;j<wlength;j++){
            if(sentence[start+j]!=word[j]){
                break;
             }
         }
        if(j==wlength){
            //都相同,将i的值定位到start+j的位置
             i=start+wlength-1; 
             count++;
         }
     }

    return count;
}
  • 完成了头文件和实现文件的创建以后,我们需要在main函数中使用这些函数
#include<stdio.h>
#include"myString.h"
int main(){
    char sentence[100]={};
    char word[20]={};
    
     char *wdes="请输入查找单词";//定义一个字符串并且给它赋值。
     char *sdes="请输入语句";
    input(sentence,sdes);
    input(word,wdes);
    
    printf("%s\n",sentence);
    printf("%s\n",word);
    
    int count=find(sentence,word);
    printf("出现%d次:\n",count);
    
    return 0;
}
  • 以上就是我们今天的全部内容了,你还在等什么,赶紧在电脑上把代码敲起来吧!!!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343