day10

指针指向数组

1.1 指针与数组的关系

1> 一维数组的数组名,本质上是一个该数组的第一个元素的地址

int arr[5]; arr &arr[0]

2> 数组名是一个地址常量,不能被重新赋值,但是,数组名可以进行偏移

3> 二维数组的数组名,从数值上来说也是一个该数组第一个元素的地址

int arr[3][4]; arr &arr[0] arr[0] &arr[0][0] arr[1] &arr[1][0]

1.2 指针与一维数组关系实现

1> 指针与一维数组的关系

#include<stdio.h>

int main(int argc, const char *argv[]) {

//定义一个一维数组

int arr[] = {3,8,3,2,4}; int len = sizeof(arr)/sizeof(arr[0]); //求数组长度

//定义指针指向一维数组

int *ptr = arr; //int *ptr = &arr[0];

//数据输出方式1,从值的角度 printf("数据元素分别是:");

for(int i=0; i<len; i++) { printf("%d\t", arr[i]); } printf("\n");

//输出方式2:从数组名的角度

printf("数据元素分别是:");

for(int i=0; i<len; i++) {

printf("%d\t", *(arr+i) );

}

printf("\n");

//输出方式3:从指针变量的角度

printf("数据元素分别是:");

for(int i=0; i<len; i++) {

printf("%d\t", *(ptr+i) );

} printf("\n");

//输出方式4:从指针的角度找值 printf("数据元素分别是:");

for(int i=0; i<len; i++) { printf("%d\t", ptr[i]); } printf("\n");

//输出方式5:从指针变量的角度 printf("数据元素分别是:"); for(int i=0; i<len; i++) { printf("%d\t", *(ptr++)); } printf("\n"); return 0; }

2> 指针指向一维整型数组作为函数参数传递

当实参使用的是数组名进行传递时,本质上传递的是数组首元素的地址

被调函数的形参可以是一个数组接收,也可以是一个指针变量接收

虽然使用的是数组接收,但是,本质上也还是使用的是指针接收

#include<stdio.h> //使用数组接受 /*

void sort(int arr[], int n) {

for(int i=1; i<n; i++) {

for(int j=0; j<n-i; j++) {

if(arr[j] > arr[j+1]) {

int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp;

}

}

}

printf("排序成功\n"); } */ //使用指针接受

void sort(int *arr, int n) { for(int i=1; i<n; i++) {

for(int j=0; j<n-i; j++) {

if(arr[j] > arr[j+1]) //if(*(arr+j) > *(arr+j+1)) {

int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp;

}

}

}

printf("排序成功\n");

}

/***************************主程序**********************/

int main(int argc, const char *argv[]) {

int arr[5] = {3,9,2,7,6};

//调用排序函数,将数组进行排序

sort(arr, 5); //sort(&arr[0], 5)

printf("排序后的结果为:"); for(int i=0; i<5; i++) { printf("%d\t", arr[i]); } printf("\n"); return 0; }

3> 指针指向一维字符数组作为函数参数传递

1、由于字符串有结束标识,所以接收字符串时,可以不用接收字符串长度

2、一般对传入的字符串如果不进行更改操作的话,需要加上关键字const修饰

3、指针与字符串的关系

4、字符串本质上是一个指针常量,可以定义一个指针指向一个字符串 2、当一个指针指向一个字符串时,不能通过该指针改变字符串中的内容 

4> const 关键字

1、const 中文含义 常量,常属性

2、该关键字是一个变量的存储格式,修饰变量时,表示给该变量添加常属性

3、const修饰的变量,虽然有常属性,但是,还依然是一个变量

4、定义变量的格式 const 数据类型 变量名;

5、修饰变量时,包括修饰普通变量和指针变量,有所不同

6> const修饰指针变量(重要)

定义指针变量的格式: 数据类型 * 指针名;

#include<stdio.h>

int main(int argc, const char *argv[])

{

int num = 520;

int key = 1314; //定义指针变量指向普通变量

const int *p1 = # //p1保护的是指针指向内存空间中的值

int const *p2 = # //与p1一样

int * const p3 = # //p3保护的是指针中的值

const int * const p4 = # //两个都保护 //验证p1保护哪个内容

//*p1 = 999; //更改指针指向内存空间中的值,报错 //p1 = &key; //更改指针的值

//验证p2保护哪个内容 //*p2 = 999; //更改指针指向内存空间中的值,报错 // p2 = &key; //更改指针的值

//验证p3保护哪个内容 //*p3 = 999; //更改指针指向内存空间中的值,报错 // p3 = &key; //更改指针的值

//验证p4保护哪个内容 *p4 = 999; //更改指针指向内存空间中的值,报错 p4 = &key; //更改指针的值 return 0; }

1> 自定义函数(my_strlen)实现strlen函数的功能

#include <stdio.h>
#include <string.h>
int my_strlen(const char *srt)
{
    if(*srt =='\0')//找到结束符
    {
        return 0;
    }
    else
    {
        return 1+my_strlen(srt+1);//向后递归
    }
    
}
int main()
{
    char src[100] = " ";
    char *a =src;
    printf("请输入一个字符串\n");
    fgets(src, sizeof(src), stdin);
    printf("%d\n", my_strlen(a)-1);
    return 0;
}

2> 自定义函数(my_strcpy)实现strcpy函数的功能

#include <stdio.h>
#include <string.h>
void my_strcpy(char *dest,const char *src )
{
    while(*src)//遍历src数组
    {
        *(dest++)=*(src++);对应元素赋值
    }
    *dest ='\0';
}
int main()
{   
    char dest[100]=" ";
    char src[100] = " ";
    printf("请输入第一个字符串\n");
    fgets(dest, sizeof(dest), stdin);
    printf("请输入第二个字符串\n");
    fgets(src, sizeof(src), stdin);
    my_strcpy(dest,src);
    printf("%s",dest);
    return 0;
}

3> 自定义函数(my_strcmp)实现strcmp函数的功能

#include <stdio.h>
#include <string.h>
int my_strcmp(const char *dest,const char *src )
{
    if(*dest>*src)//大于
    {
        return 1;
    }
    else if(*dest<*src)小于
    {
        return -1;
    }
    else if(*dest=='\0'&&*src=='\0')//二者都为空且二者之前的元素完全相同
    {
       return 0;
    }
    else
    {
         return my_strcmp(dest+1,src+1);//递归到下一个字符进行比较
    }
}
int main()
{   
    char dest[100]=" ";
    char src[100] = " ";
    printf("请输入第一个字符串\n");
    fgets(dest, sizeof(dest), stdin);
    printf("请输入第二个字符串\n");
    fgets(src, sizeof(src), stdin);
    printf("%d\n",my_strcmp(dest,src));
    return 0;
}

4> 自定义函数(my_strcat)实现strcat函数的功能

#include <stdio.h>
#include <string.h>
char* my_strcat(char *dest, const char *src)
{
    char *a=dest;
    int k = strlen(a)-1 ;//储存'\0'的下标右换行符要-1
    for (int i = 0; i <=strlen(src)-1; i++)//src[i]能取到'\0'
    {
        *(a + k + i) = *(src + i);//从'\0'开始赋值到赋值'\0'结束
    }
    return a;//返回指针
}
int main()
{
    char dest[100] = " ";
    char src[100] = " ";
    printf("请输入第一个字符串\n");
    fgets(dest, sizeof(dest), stdin);//吸收回车
    printf("请输入第二个字符串\n");
    fgets(src, sizeof(src), stdin);
    printf("%s",my_strcat(dest, src));
    return 0;
}

5> 自定义函数(my_strstr)实现求src字符串中是否包含子串dest字符串

#include <stdio.h>
#include <string.h>
int  my_strstr(const char *dest,const char*src)
{

    if(strlen(dest)>strlen(src))//dest长度大于src
    {

    }
    else
    {
        for(int i=0;i<strlen(src);i++)
        {
            int k=0;//标识符
          for(int j=0;j<strlen(src);j++)
          {
                 if(dest[j]==src[i+j])//对应元素相同
                 {
                     k++;
                 }
          }
          if(k==strlen(dest))//全部相同
          {
              return 1;//有子串
          }
          k=0;//重置为0
        }
    }
    return 0;//无子串
}
int main()
{  char dest[100] = " ";
    char src[100] = " ";
    printf("请输入第一个字符串\n");
    fgets(dest, sizeof(dest), stdin);//会吸收回车符
    printf("请输入第二个字符串\n");
    fgets(src, sizeof(src), stdin);
    printf("%d\n",my_strstr(dest,src));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值