本节内容
-
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;
}
-
以上就是我们今天的全部内容了,你还在等什么,赶紧在电脑上把代码敲起来吧!!!