7.12C语言

笔记

指针

三.指针指向普通变量作为函数参数

指针作为函数的参数进行数据传递时,不一定是地址传递

即普通变量作为函数的参数进行数据传递时,在函数结束后,无论函数中进行了什么操作,普通变量的值在函数结束后不会变化,即函数进行前后,传递的普通变量的值是一样的。

要想普通变量的值在函数结束后与函数内部运行结果一致,就需在传递时用指针传递普通变量的地址,在函数中对普通变量地址中的内容进行操作,才可使函数结束后,变量进行改变。

四.指针与数组的关系

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值