char *a[] 输入赋值的实现的两种方式

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 15
void sort(char *a[],int n)
{
	for(int i=0;i<n-1;i++)
	{
		for(int j=0;j<n-i-1;j++)
		{
			if(strcmp(a[j],a[j+1])<0)
			{
				char c[N];
				strcpy(c,a[j]);
				strcpy(a[j],a[j+1]);
				strcpy(a[j+1],c);
			}
		}
	}
}
int main()
{
    char *a[N];
    int n;
    scanf("%d",&n);//字符串个数
    fflush(stdin);
    for(int i=0;i<n;i++)
    {
        int j=0;
        a[i]=(char *)malloc(sizeof(char)*15);
        char c;
        if(a[i]!=NULL)
        {
            do
            {
               c=getchar();
               if(c!='\n') a[i][j++]=c;
            }while(c!='\n');
        }
        fflush(stdin);
    }
    //在进行排序函数 
    sort(a,n);
    for(int i=0;i<n;i++) printf("%s ",a[i]);
    return 0;
}
#include<stdio.h>
#include<string.h>
#define N 60
void ch(char *s[],int n)
{
	for(int i=0;i<n-1;i++)
	{
		for(int j=0;j<n-i-1;j++)
		{
			if(s[j]<s[j+1])
			{
				char a[N];
				strcpy(a,s[j]);
				strcpy(s[j],s[j+1]);
				strcpy(s[j+1],a);
			}
		}
	}
	for(int i=0;i<n;i++) puts(s[i]);
}
int main()
{ 
    int n;
    scanf("%d",&n);
    char *s[N];
    for(int i=0;i<n;i++)
    {
        s[i]=(char *)malloc(sizeof(s[i]));
		scanf("%s",s[i]);
    }
    ch(s,n);
    return 0;
}

C语言中,void* 类型是一个通用的指针类型,它可以指向任意类型的对象。而 `void *(pf)(char *)` 这个表述涉及到函数指针的概念。 在C语言里,函数指针允许程序员将一个函数作为一个参数传递给另一个函数,或者将其赋值到变量中并稍后调用。它提供了一种高级的编程技巧,用于编写更灵活和模块化的代码。 ### `void *pf(char *)` 的解释 这个表达式描述了函数指针 `pf`,它是针对 `char *` 参数的函数的指针,并返回一个无类型指针 (`void *`)。也就是说,函数 `pf` 接收一个字符串作为输入,它的功能并不重要,关键在于它可以接受任何类型的指针作为参数。 #### 示例说明 假设我们有这样一个函数,该函数接收一个 `void *` 指针作为参数,并通过它间接访问数据,无论数据的实际类型是什么。 ```c #include <stdio.h> // 定义一个使用 void * 的函数 void process_data(void *data) { printf("Processing data of type: %s\n", (char *)data); } // 主函数中的测试示例 int main() { char my_char = 'A'; int my_int = 10; // 将字符转换为 void * void *ptr_to_char = &my_char; // 调用函数,传递 void * 指针 process_data(ptr_to_char); // 同样地,将整数转换为 void * void *ptr_to_int = &my_int; // 再次调用函数,传递 void * 指针 process_data(ptr_to_int); return 0; } ``` 在这个例子中,尽管我们用 `process_data()` 函数处理了两个不同类型的数据(字符和整数),但我们只是简单地打印出了数据的类型。这是因为在 C 中,你可以通过类型转换(`(char *)data`)访问任何类型数据的一个元素(这里仅适用于基本类型)。然而,这种方式可能会导致错误和难以预测的行为,尤其是在不进行适当类型检查的情况下。正确的做法是在处理数据之前确认其类型。 ### 相关问题: 1. **如何安全地使用 `void *` 和函数指针**? - 需要进行显式的类型检查和转换,避免隐式的类型推断导致的潜在问题。 2. **函数指针在何时会有用**? - 函数指针可用于创建回调函数、实现事件处理器、动态绑定、策略模式等。 3. **在使用函数指针时应该注意哪些常见陷阱**? - 确保正确地管理资源,防止野指针的产生。 - 明确理解类型转换的后果,避免数据丢失或安全漏洞。 - 确保目标函数的有效性以及参数的正确性,避免无效或非法调用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值