-
利用指针变量将一个数组中的数据反向输出。
c#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; }

-
利用指针变量计算下标为奇数的数组的和;
c#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); }
-
确认整型,字符型,浮点型指针变量的大小;
c#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; }

- 利用指针变量输出字符数组中的所有字符。
c
#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;
}

-
编写一个函数,用指针变量做参数,用于求出一个浮点型数组元素的平均值。
c#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)在一个字符串中统计数字字符的个数
c#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]
c#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 的数量:
c#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++) { //判断是否为0 if(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; }
-
编写一个指针函数,返回二维数组中最大元素的地址。
c/************************************************************************* > File Name: > Author: rch ************************************************************************/ #include <stdio.h> #define N 3 int 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个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个元素;
c/************************************************************************* > 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;
c/************************************************************************* > 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]; // 修正赋值方向(原来是反的) } // 在目标位置插入100 arr[insert_pos + 1] = 100; // 输出结果 printf("插入后的数组: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); // 释放内存 free(arr); return 0; }
