挑战指针题

  1. 利用指针变量将一个数组中的数据反向输出。

    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;
    }
  1. 利用指针变量计算下标为奇数的数组的和;

    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);
    }
  2. 确认整型,字符型,浮点型指针变量的大小;

    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;
    }
  1. 利用指针变量输出字符数组中的所有字符。
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;
}
  1. 编写一个函数,用指针变量做参数,用于求出一个浮点型数组元素的平均值。

    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;
    }
  2. 编写函数,要求用指针做形参,分别实现以下功能: (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;
    }
  1. 编写函数,要求用指针做形参,实现将二维数组(行列相同)的进行转置(行列数据互换): 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;
    }
  2. 编写函数,要求用指针做形参,实现统计二维数组上三角中的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;
    }
  3. 编写一个指针函数,返回二维数组中最大元素的地址。

    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;
    }
  1. 动态申请一个具有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;
    }
  1. 动态申请一个整型数组,并给每个元素赋值,要求删除第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;
    }
  1. 动态申请一个整型数组,并给每个元素赋值,要求在第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;
    }
相关推荐
啊阿狸不会拉杆8 分钟前
《算法导论》第 1 章 - 算法在计算中的作用
开发语言·数据结构·c++·算法·排序算法
WBluuue10 分钟前
数据结构与算法:哈希函数的应用及一些工程算法
c++·算法·面试·哈希算法
刃神太酷啦26 分钟前
C++ 容器适配器与核心数据结构精解:栈、队列、deque 底层实现与实战应用----《Hello C++ Wrold!》(17)--(C/C++)
java·c语言·数据结构·c++·qt·算法·leetcode
阑梦清川37 分钟前
算法竞赛---宽度优先搜索求解最短路径问题
算法
syqwq1 小时前
syqwq code template
算法
是店小二呀1 小时前
【动态规划 | 子序列问题】子序列问题的最优解:动态规划方法详解
算法·动态规划·代理模式
啊我不会诶2 小时前
BD202402跑步 线性求逆元 素数筛 数学
学习·算法·补题
minichao_sz2 小时前
gdb print设置技巧,离线查看复杂结构体和数组变量内容,展开多层嵌套的结构体的方法
c语言·stm32·嵌入式硬件
是阿建吖!2 小时前
【优选算法】分治--归并排序
数据结构·算法·排序算法