挑战指针题
-
利用指针变量将一个数组中的数据反向输出。
#include <stdio.h>int main() {//定义数组int arr[] = {1,2,3,4,5};//定义指针指向数组首元素int *p = arr;//计算数组大小int len = sizeof(arr) / sizeof(arr[0]);//定义数组指向数组末尾元素int *q = arr + len - 1;while(p < q){int temp = *p;*p = *q;*q = temp;//指针移动p++;q--;}//遍历数组for(int i = 0;i<len;i++){printf("%d",arr[i]);}return 0; }

-
利用指针变量计算下标为奇数的数组的和;
#include <stdio.h>int main() {int sum = 0;int arr[] = {1,2,3,4,5};int len = sizeof(arr) / sizeof(arr[0]);int *p = arr;for(int i = 0;i < len ;i++){if(arr[i] % 2 != 0)sum += *(p + i); }printf("下标是奇数和为:%d\n",sum); }
-
确认整型,字符型,浮点型指针变量的大小;
#include <stdio.h>int main() {int *int_p;float *float_p;char *char_p;printf("整型%zu字节\n",sizeof(int_p));printf("浮点型%zu字节\n",sizeof(float_p));printf("字节型%zu字节\n",sizeof(char_p));return 0; }

4. 利用指针变量输出字符数组中的所有字符。
#include <stdio.h>int main()
{char arr[] = "hihi,hi\0hihi,hi";char *p = arr;while(*p != '\0'){printf("%c",*p);p++;}printf("\n");return 0;
}

-
编写一个函数,用指针变量做参数,用于求出一个浮点型数组元素的平均值。
#include <stdio.h>float _float_average(float *arr,int size) {//处理空数组的情况if (size <= 0)return 0.0f;float sum = 0.0f;for(int i = 0;i < size;i++){sum += *(arr + i);}return sum / size; }int main() {float arr[] = {1.2f,2.4f,4.5f};int size = sizeof(arr) / sizeof(arr[0]);float avg = _float_average(arr,size);printf("数组平均值:%.2f\n",avg);return 0; }
-
编写函数,要求用指针做形参,分别实现以下功能: (1)求一个字符串长度 (2)在一个字符串中统计大写字母的个数 (3)在一个字符串中统计数字字符的个数
#include <stdio.h>int str1(const char *str) {int len = 0;while(*str++){len++;}return len; }//统计大写字母个数 int str2(const char *str) {int count = 0;while(*str){if(*str >= 'A'&& *str <= 'Z'){count++;}str++;}return count;}//统计数字字符个数 int str3(const char *str) {int count = 0;while(*str){if(*str >= '0' && *str <= '9'){count++;}str++;}return count; }int main() {char str[] = "ILoveYou521";// 测试求字符串长度printf("字符串长度: %d\n", str1(str));// 测试统计大写字母个数printf("大写字母个数: %d\n", str2(str));// 测试统计数字字符个数printf("数字字符个数: %d\n", str3(str));return 0; }

-
编写函数,要求用指针做形参,实现将二维数组(行列相同)的进行转置(行列数据互换): int (*p)[N]
#include <stdio.h> #define N 3 void transpose(int (*p)[N], int result[N][N]) {for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {result[j][i] = p[i][j]; }} }int main() {int arr[N][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};int result[N][N]; transpose(arr, result); printf("转置后:\n");for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {printf("%d ", result[i][j]);}printf("\n");}return 0; }
-
编写函数,要求用指针做形参,实现统计二维数组上三角中的0 的数量:
#include <stdio.h> #define N 3 int fun_1(int (*p)[N]) //定义指针 {int num = 0; //统计0的个数初始化//遍历for (int i = 0; i < N; i++) {for (int j = i; j < N; j++) {//判断是否为0if(p[i][j] == 0){//计数num++;}}}return num; }int main() {//原数组int arr[N][N] = {{1, 0, 0}, {4, 0, 6}, {7, 8, 9}};//调用fun_1函数统计上三角区域中0的数量int sum = fun_1(arr); printf("上三角区中有%d个0\n",sum);return 0; }
-
编写一个指针函数,返回二维数组中最大元素的地址。
/*************************************************************************> File Name: > Author: rch************************************************************************/ #include <stdio.h> #define N 3int find_max(int (*p)[N],int *row = 0,int *col = 0) {int num_max = p[0][0];for(int i = 0; i < N;i++){for(int j = 0; j <N ; j++){if(p[i][j] > num_max){num_max = p[i][j];*row = i;*col = j;}}}return num_max; }int main(int argc,char *argv[]) {//原数组int arr[N][N] = {{1, 0, 8}, {4, 7, 6}, {7, 8, 9}};int max_row,max_col;//存最大最小值行列下标// 调用find_max函数查找最大值及其位置int sum_max = find_max(arr,&max_row,&max_col);printf("最大值下标是%d,位于第%d行%d列\n",sum_max,max_row+1,max_col+1);return 0; }

10. 动态申请一个具有10个float类型元素的内存空间,从一个已有的数组中拷贝数据,并找出第一次出现 12.35 的下标位置,并输出。
```c
/*************************************************************************> File Name: demo11.c> Author: rch> Description: ************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {// 已有数组float arr_1[] = {1.2, 3.4, 5.6, 12.35, 7.8, 9.0, 12.35, 11.22, 13.45, 6.7};int n = 10; // 动态申请10个float类型元素的内存空间float *arr_2 = (float *)malloc(n * sizeof(float));if (arr_2 == NULL) {printf("内存分配失败\n");return 1;}// 从已有数组拷贝数据到动态分配的内存memcpy(arr_2, arr_1, n * sizeof(float));// 查找第一次出现12.35的下标位置int index = -1;for (int i = 0; i < n; i++) {if (abs(arr_2[i] - 12.35) < 0.0001) {index = i;break; // 找到第一个就退出循环}}if (index != -1) {printf("12.35第一次出现的下标位置是: %d\n", index);} else {printf("未找到12.35\n");}// 释放动态分配的内存free(arr_2);arr_2 = NULL; // 避免野指针return 0;
}

-
动态申请一个整型数组,并给每个元素赋值,要求删除第3个元素;
/*************************************************************************> File Name: 12.c> Author: rch> Description: ************************************************************************/ #include <stdio.h> #include <stdlib.h>int main(int argc, char *argv[]) {int n = 6;int *arr = (int *)malloc(n * sizeof(int)); // 定义普通int指针而非指针数组if(arr == NULL){printf("内存分配失败\n"); return 1;}// 给数组元素赋值for (int i = 0; i < n; i++){arr[i] = i + 1; // 使用正确定义的arr变量}// 要删除第三个元素(下标为2)int back = 2;n--;for (int i = back; i < n; i++){arr[i] = arr[i + 1];}// 重新申请内存存储删除后的数组int *newarr = (int *)realloc(arr, n * sizeof(int));if(newarr == NULL){printf("内存重新分配失败\n");free(arr);return 1;}arr = newarr;// 输出结果for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");// 释放内存free(arr);return 0; }

-
动态申请一个整型数组,并给每个元素赋值,要求在第4个元素后插入100;
/*************************************************************************> File Name: > Author: rch> Description: ************************************************************************/ #include <stdio.h> #include <stdlib.h>int main(int argc, char *argv[]) {int n = 6;int *arr = (int *)malloc(n * sizeof(int)); // 定义普通int指针而非指针数组if(arr == NULL){printf("内存分配失败\n"); return 1;}// 给数组元素赋值for (int i = 0; i < n; i++){arr[i] = i + 1; // 使用正确定义的arr变量}// 要插入第四个元素(下标为3)int insert_pos = 3; // 第4个元素的下标n++; // 元素总数增加1(关键修正:原来是原来是n--,这是删除逻辑)// 重新分配内存(容量+1)int *newarr = (int *)realloc(arr, n * sizeof(int));if(newarr == NULL){printf("内存重新分配失败\n");free(arr);return 1;}arr = newarr;// 元素后移(从最后一个元素开始,避免覆盖)for (int i = n - 1; i > insert_pos + 1; i--) // 修正循环范围{arr[i] = arr[i - 1]; // 修正赋值方向(原来是反的)}// 在目标位置插入100arr[insert_pos + 1] = 100;// 输出结果printf("插入后的数组: ");for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");// 释放内存free(arr);return 0; }

