C语言基础:指针练习题(上)

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

#include <stdio.h>

void reversePrint(int *arr, int len);

int main() 
{
    int arr[] = {10, 20, 30, 40, 50};
    int len = sizeof(arr) / sizeof(arr[0]);
    
    printf("原数组:");
    
    for (int i = 0 ; i < len ; i++)
    {
    	printf("%d ",arr[i]);
	}
    printf("\n");
    
    reversePrint(arr, len); // 输出: 50 40 30 20 10
    
    return 0;
}
void reversePrint(int *arr, int len) 
{
    printf("数组反向输出: ");
    for (int i = len - 1; i >= 0; i--)
	{
        printf("%d ", *(arr + i)); // 通过指针访问数组元素
    }
    printf("\n");
}

2. 利用指针变量计算下标为奇数的数组的和

#include <stdio.h>

int Sum(int *arr, int len);

int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6};
    int len = sizeof(arr) / sizeof(arr[0]);
    
    printf("原数组:");
    
    for (int i = 0 ; i < len ; i++)
    {
    	printf("%d ",arr[i]);
	}
    printf("\n");
    printf("其中下标为奇数的数是:");
    int addsum = Sum(arr, len);
    printf("\n下标为奇数的元素和: %d\n", addsum);
    
    return 0;
}

int Sum(int *arr, int len)
{
    int sum = 0;
    for (int i = 1; i < len; i += 2)
	{
        sum += *(arr + i);
        printf("%d ",*(arr + i));
    }
    return sum;
}

3. 确认整型,字符型,浮点型指针变量的大小

#include <stdio.h>

int main()
{
    int *intt;
    char *charr;
    float *floatt;
    
    printf("整型指针大小: %zu\n", sizeof(intt));
    printf("字符型指针大小: %zu\n", sizeof(charr));
    printf("浮点型指针大小: %zu\n", sizeof(floatt));
    
    return 0;
}

4. 利用指针变量输出字符数组中的所有字符

#include <stdio.h>

void pc(char *str);

int main() 
{
    char str[] = "Hello, World!";
    printf("输出: ");
    pc(str);
    
    return 0;
}
void pc(char *str) 
{
    while (*str != '\0') 
	{
        printf("%c", *str);
        str++;
    }
}

5. 编写一个函数,用指针变量做参数,用于求出一个浮点型数组元素的平均值

#include <stdio.h>

float test(float *arr, int size);
int main()
{
    float arr[] = {1.5f, 2.5f, 3.5f, 4.5f};
    int len = sizeof(arr) / sizeof(arr[0]);
    printf("数组:");
    float avg = test(arr, len);
    printf("\n平均值: %.2f\n", avg);
    
    return 0;
}
float test(float *arr, int len)
{
    if (len == 0) return 0.0f;
    
    float sum = 0.0f;
    for (int i = 0; i < len; i++)
	{
        sum += *(arr + i);
        printf("%.2f  ", *(arr + i));
    }
    return sum / len;
}

6. 编写函数,要求用指针做形参,分别实现以下功能: 
(1)求一个字符串长度 
(2)在一个字符串中统计大写字母的个数 
(3)在一个字符串中统计数字字符的个数

#include <stdio.h>
#include <ctype.h>

int stringLength(char *str);
int countUpper(char *str);
int countDigits(char *str);
int main()
{
    char str[] = "HelloWorld12345ILoveYou!";
    
    printf("字符串长度: %d\n", stringLength(str));
    printf("大写字母个数: %d\n", countUpper(str));
    printf("数字字符个数: %d\n", countDigits(str));
    
    return 0;
}
// 求 字符串 长度
int stringLength(char *str)
{
    char *ptr = str;// 创建一个临时指针 ptr,指向字符串的起始位置
    while (*ptr != '\0')
    {
    	ptr++;
	}
    return ptr - str;// 指针减法 ptr - str 得到的是两个指针之间的元素个数(即字符串长度)
}
// 统计 大写字母 个数
int countUpper(char *str)
{
    int count = 0;
    while (*str != '\0')
	{
        if (isupper(*str))
        {
        	count++;
		}
		str++;
    }
    return count;
}
// 统计 数字字符 个数
int countDigits(char *str)
{
    int count = 0;
    while (*str != '\0')
	{
        if (isdigit(*str))
        {
        	count++;
		}
		str++;
    }
    return count;
}

7. 编写函数,要求用指针做形参,实现将二维数组(行列相同)的进行转置(行列数据互换): int (*p)[N]

#include <stdio.h>
#define N 3

void transpose(int (*p)[N]);
void printArray(int (*p)[N]); 
int main()
{
    int arr[N][N] ={{1, 2, 3},{4, 5, 6},{7, 8, 9}};
    
    printf("转换前:\n");
    printArray(arr);
    
    transpose(arr);
    
    printf("转换后:\n");
    printArray(arr);
    return 0;
}
// 打印二维数组
void printArray(int (*p)[N])
{
    for (int i = 0; i < N; i++)
	{
        for (int j = 0; j < N; j++)
		{
            printf("%-4d", *(*(p + i) + j));
        }
        printf("\n");
    }
    printf("\n");
}
// 二维数组转换 
void transpose(int (*p)[N])
{
    for (int i = 0; i < N; i++)
	{
        for (int j = i + 1; j < N; j++)
		{
            int temp = *(*(p + i) + j);// 相当于:p[i][j]; 
            *(*(p + i) + j) = *(*(p + j) + i);
            *(*(p + j) + i) = temp;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值