目录
学习目标:
学习内容:
1.指针指向数组
1.1 指针与数组的关系
1.2 指针与一维数组关系实现
1.2.1 指针与一维数组的关系
1.2.2 指针指向一维整型数组作为函数参数传递
课外作业:
学习目标:
- 一周掌握 C基础知识
学习内容:
1.
指针指向数组
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.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;}
1.2.2 指针指向一维整型数组作为函数参数传递
当实参使用的是数组名进行传递时,本质上传递的是数组首元素的地址
被调函数的形参可以是一个数组接收,也可以是一个指针变量接收
虽然使用的是数组接收,但是,本质上也还是使用的是指针接收
例如:主函数中定义一个长度为8的数组,调用自定义函数完成输入、自定义函数完成输出、自定义函数求最大值、自定义函数完成数组的逆置。并对这些函数进行测试。要求,形参使用指针接收
#include <stdio.h>#define MAX 8// 函数声明void inputArray(int *arr, int length);void outputArray(const int *arr, int length);int findMaxValue(const int *arr, int length);void reverseArray(int *arr, int length);int main() {int arr[MAX];printf("请输入%d个整数:\n", MAX);inputArray(arr, MAX); // 输入数组printf("输入的数组为:\n");outputArray(arr, MAX); // 输出数组int maxVal = findMaxValue(arr, MAX); // 求最大值printf("数组中的最大值是:%d\n", maxVal);reverseArray(arr, MAX); // 逆置数组printf("逆置后的数组为:\n");outputArray(arr, MAX); // 输出逆置后的数组return 0;}// 输入数组元素void inputArray(int *arr, int length) {for (int i = 0; i < length; i++) {scanf("%d", arr + i);}}// 输出数组元素void outputArray(const int *arr, int length) {for (int i = 0; i < length; i++) {printf("%d ", arr[i]);}printf("\n");}// 求数组的最大值int findMaxValue(const int *arr, int length) {int max = arr[0];for (int i = 1; i < length; i++) {if (arr[i] > max) {max = arr[i];}}return max;}// 逆置数组void reverseArray(int *arr, int length) {for (int i = 0; i < length / 2; i++) {int temp = arr[i];arr[i] = arr[length - 1 - i];arr[length - 1 - i] = temp;}}
课外作业:
1. 自定义函数(my_strlen)实现strlen函数的功能
解析:
#include<stdio.h>
#include<string.h>
#define MAX 50
void my_strlen(char *a,int count){printf("请输入字符串:");gets(a);while (*a++){count++;}printf("长度为%d\n",count);
}int main(int argc, char const *argv[])
{char str[MAX]="";char s[MAX]="";int count=0;my_strlen(str,count);return 0;
}
2. 自定义函数(my_strcpy)实现strcpy函数的功能
解析:
#include<stdio.h>
#include<string.h>
#define MAX 50void my_strcpy(char *a,const char *b){while (*b != '\0'){*a=*b; //将b里的值写入aa++;b++;}*a='\0'; //‘\0’写入a}
int main(int argc, char const *argv[])
{char str[MAX]="";char s[MAX]="";int count=0;printf("请输入第一个字符串内容");gets(str);printf("请输入第二个字符串内容");gets(s);my_strcpy(str,s); //调用函数printf("str=%s\t,s=%s\t",str,s);return 0;
}
3.自定义函数(my_strcmp)实现strcmp函数的功能
解析:
#include<stdio.h>
#include<string.h>
#define MAX 50int my_strcmp(const char *a,const char *b){
int len = sizeof(*b)/sizeof(char);while (*a && *b){a++;b++;}return (char) *a -(char) *b;}
int main(int argc, char const *argv[])
{char str[MAX]="";char s[MAX]="";int count=0;printf("请输入第一个字符串内容");gets(str);printf("请输入第二个字符串内容");gets(s);int sum = my_strcmp(str,s);if(sum ==0){printf("相等");}else if (sum <0){printf("第二个字符串内容大");}else{printf("第一个字符串内容大");}return 0;
}
4.自定义函数(my_strcat)实现strcat函数的功能
解析:
#include<stdio.h>
#include<string.h>
#define MAX 50void my_strcat(char *a,const char *b){while (*a != '\0'){a++;}while (*b != '\0'){*a++ = *b++;}*a = '\0';
}
int main(int argc, char const *argv[])
{char str[MAX]="";char s[MAX]="";int count=0;printf("请输入第一个字符串内容");gets(str);printf("请输入第二个字符串内容");gets(s);my_strcat(str,s);printf("str=%s\n",str);return 0;
}
5.自定义函数(my_strstr)实现求src字符串中是否包含子串dest字符串
解析:
#include <stdio.h>// 自定义函数 my_strstr,实现 strstr 函数的功能
char my_strstr(const char *src, const char *dest) {int src_len = 0, dest_len = 0;const char *src_ptr, *dest_ptr;// 计算 dest 字符串的长度while (dest[dest_len] != '\0') {dest_len++;}// 遍历 src 字符串for (src_ptr = src; *src_ptr != '\0'; src_ptr++) {// 如果当前字符匹配 dest 的第一个字符if (*src_ptr == *dest) {int i = 0;// 检查 dest 是否完全匹配for (i = 0; i < dest_len; i++) {// 如果字符不匹配或到达 src 的末尾,则跳出循环if (src_ptr[i] != dest[i] || src_ptr[i] == '\0') {break;}}// 如果完全匹配,返回1if (i == dest_len) {return 1;}}}// 如果没有找到 dest,返回 0return 0;
}int main() {char str[50]="";char s[50]="";printf("请输入第一个字符串内容");gets(str);printf("请输入第二个字符串内容");gets(s);// 使用自定义函数查找子串char found = my_strstr(str, s);if (found != 0) {printf("找到子串\n" );} else {printf("子串未找到。\n");}return 0;
}