目錄
學習目標:
學習內容:
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;
}