笔记
指针
三.指针指向普通变量作为函数参数
指针作为函数的参数进行数据传递时,不一定是地址传递
即普通变量作为函数的参数进行数据传递时,在函数结束后,无论函数中进行了什么操作,普通变量的值在函数结束后不会变化,即函数进行前后,传递的普通变量的值是一样的。
要想普通变量的值在函数结束后与函数内部运行结果一致,就需在传递时用指针传递普通变量的地址,在函数中对普通变量地址中的内容进行操作,才可使函数结束后,变量进行改变。
四.指针与数组的关系
1)一维数组的数组名,本质上就是一个该数组的第一个元素的地址
2)数组名是一个地址常量,不能被从新赋值但是,数组名可以进行偏移
3)二维数组的数组名,从数值上来说也是一个该数组第一个元素的地址
4)指针指向一维整形数组作为函数参数传递,当实参使用的是数组名进行传递时,本质上传递的是数组首元素的地址,被调用的形参可以说一个数组接收,也可以是一个指针变量接收,虽然使用的是数组接收,但是,本质上也还是使用的是指针接收
5)指针指向一维字符数组作为函数参数传递
1.由于字符串有结束标识,所以接收字符串时,可以不用接收字符串长度
2.一般对传入的字符串如果不进行更改操作的话,需要加上关键字const修饰
6.)指针与字符串的关系
1.字符串本质上是一个指针常量,可以定义一个指针指向一个字符串
2.当一个指针指向一个字符串时,不能通过该指针改变字符串的内容
列:int arr[5]; arr<==>&arr[0]
int arr[3][4]; arr<==>&arr[0] arr[0]<==>&arr[0][0] arr[1]<==>&arr[1][0]
int arr[5] = {1,2,3,4,5}; int *ptr=&arr; *(ptr+i)<==>*(arr+i)<==>arr[i]<==>ptr[i]
作业
自定义函数实现,strlen strcpy strcmp strcat strstr的功能
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int my_strcmp(const char*arr,const char*brr)
{
while(*arr++&&*brr++)
{
if(*arr!=*brr)
return *arr-*brr;
}
return 0;
}
void my_strcat(char*arr,const char*brr)
{
while(1)
{
if(*arr=='\0')
{
while(*brr)
{
*arr++=*brr++;
}
break;
}
*arr++;
}
}
void my_strcpy(char*arr,const char*brr)
{
while(*brr)
{
*arr++=*brr++;
}
*arr='\0';
}
int my_strlen(const char *str)
{
if(*str=='\0')
return 0;
else
return 1+my_strlen(str+1);
}
char *my_strstr(char *arr,char*brr)
{
char *count=NULL;
char *p=NULL;
char *q=NULL;
int flag=0;
while(*brr)
{
if(*arr==*brr)//判断字符串中是否有字母与子串首字母相等,相等后进入循环
{
q=arr;//记录两个字符串现在的位置
p=brr;
while(*arr)//将子串每个字母循环一遍
{
if(*arr++!=*brr++)//判断后面字母是否一样
{
flag=1;//如果不一样标注符置一,退出循环
break;
}
}
if(flag==0)//标识符没有置一,说明字母都相等,也就是找到了子串
{
return p;//返回子串首字母出现的位置,也就是记录原位置的p
}
else//如果后面字母不相等,则将两字符串位置返回继续对比
{
arr=q;
brr=p;
flag=0;
}
}
*brr++;
}
return NULL;
}
int main(int argc, const char *argv[])
{
char ad[M]="akj";
char ac[M]="jfl";
printf("%d\n",my_strcmp(ad,ac));
my_strcat(ad,ac);
printf("%s %d\n",ad,my_strlen(ad));
my_strcpy(ad,ac);
printf("%s %d\n",ad,my_strlen(ad));
char df[M]="dcabdefabbb";
char de[M]="abbb";
printf("%s\n",my_strstr(de,df));
return 0;
}