C 操作指针和函数

C 操作指针和函数,c,function,pointers,C,Function,Pointers,虽然我已经学习C语言4个月了,但我在操作指针方面遇到了困难,尤其是当必须将指针作为函数参数传递时。我有以下小代码: int getData(){ int i = -1 , people ; char **clientNames ; printf("Enter the number of people you want to save: "); scanf("%d" , &people ) ; clientNames = malloc( pe

虽然我已经学习C语言4个月了,但我在操作指针方面遇到了困难,尤其是当必须将指针作为函数参数传递时。我有以下小代码:

int getData(){

    int i = -1  , people ;
    char **clientNames ; 
    printf("Enter the number of people you want to save: ");
    scanf("%d" , &people ) ; 
    clientNames = malloc( people * sizeof(char *) ) ;
    do{
        i++ ;
        char temp[60] ;
        printf("Enter Full Name: ");
        scanf("%s" , temp ) ; 
        clientNames[i] = malloc( sizeof(temp) ) ; 
        strcpy( clientNames[i] , temp )  ;
        printf("Saved as: %s\n", clientNames[i]  );

    }while ( i != people - 1) ; 

    clientNames[i+1] = malloc( sizeof("\0") ) ;
    clientNames[i+1] = "\0" ; 

    return clientNames ; 
}

int main(){
    int i = 0 ; 
    char **C;
    C = getData() ;   
    printf("Stoped saving.\n");
    for (i=0 ; strcmp(C[i] , "\0")  ; i++ ){
        printf("%s\n", C[i] );
    }   
    return 1 ; 
}
因此,我有两个问题:

1) 编译上述代码(gcc)时,我得到警告:警告:赋值从整数生成指针,而不使用强制转换[默认情况下启用]。如何才能使这一警告消失?我试图更改getData()的返回类型,但仍然出现了相同的警告

2) 如何修改此代码,以便在main()中创建的charC在getData()中作为参数**传递?然后getData应该能够更改其内容并返回**C

这毕竟是指针的值,对吗?:)

1) 当编译上述代码(gcc)时,我得到警告:警告: 赋值从不带强制转换的整数生成指针[由启用] 默认值]。如何才能使这一警告消失?我 尝试更改getData()的返回类型,但仍然相同 警告

改变

int getData(){

因为您是从函数返回
char**
,而不是
int
。毕竟,您还应该释放已分配的内存

2) 如何修改此代码以使在中创建的字符C main()是**在getData()中作为参数传递的吗?那么getData应该 能够更改其内容并返回**C

在C语言中,参数是按值传递的。为了将指针从main传递到函数,您需要传递它的地址。所以,getData()需要一个指向C的指针。在函数中,要对C变量进行操作,必须取消对它的引用。如果要将C传递给getData(),则无需返回它。所以,它会是这样的:

void getData(char*** C){
    char** clientNames = *C;
    ...
总的来说():

1) 当编译上述代码(gcc)时,我得到警告:警告: 赋值从不带强制转换的整数生成指针[由启用] 默认值]。如何才能使这一警告消失?我 尝试更改getData()的返回类型,但仍然相同 警告

改变

int getData(){

因为您是从函数返回
char**
,而不是
int
。毕竟,您还应该释放已分配的内存

2) 如何修改此代码以使在中创建的字符C main()是**在getData()中作为参数传递的吗?那么getData应该 能够更改其内容并返回**C

在C语言中,参数是按值传递的。为了将指针从main传递到函数,您需要传递它的地址。所以,getData()需要一个指向C的指针。在函数中,要对C变量进行操作,必须取消对它的引用。如果要将C传递给getData(),则无需返回它。所以,它会是这样的:

void getData(char*** C){
    char** clientNames = *C;
    ...
总的来说():


我会告诉您,为了编写代码,您应该更改哪些行,但您几乎需要更改所有内容,因此请阅读下面的代码,并尝试跟进差异:

char** getData()
{
    int i, people;
    char** clientNames;
    char temp[60];

    printf("Enter the number of people you want to save: ");
    scanf("%d", &people);
    clientNames = malloc((people+1)*sizeof(char*));

    for (int i=0; i<people; i++)
    {
        printf("Enter Full Name: ");
        scanf("%s", temp);
        clientNames[i] = malloc(strlen(temp)+1);
        strcpy(clientNames[i], temp);
        printf("Saved as: %s\n", clientNames[i]);
    }

    clientNames[people] = NULL;
    return clientNames;
}

int main()
{
    int i;
    char** C = getData();
    printf("Stoped saving.\n");
    for (i=0; C[i]!=NULL; i++)
    {
        printf("%s\n", C[i]);
        free(C[i]);
    }
    free(C);
    return 0;
}
char**getData()
{
一,人,;
字符**客户端名称;
煤焦温度[60];
printf(“输入要保存的人数:”);
scanf(“%d”和人);
clientNames=malloc((people+1)*sizeof(char*);

对于(int i=0;i我会告诉您应该更改哪些行以编制代码,但您几乎需要更改所有内容,因此请阅读下面的代码并尝试跟进差异:

char** getData()
{
    int i, people;
    char** clientNames;
    char temp[60];

    printf("Enter the number of people you want to save: ");
    scanf("%d", &people);
    clientNames = malloc((people+1)*sizeof(char*));

    for (int i=0; i<people; i++)
    {
        printf("Enter Full Name: ");
        scanf("%s", temp);
        clientNames[i] = malloc(strlen(temp)+1);
        strcpy(clientNames[i], temp);
        printf("Saved as: %s\n", clientNames[i]);
    }

    clientNames[people] = NULL;
    return clientNames;
}

int main()
{
    int i;
    char** C = getData();
    printf("Stoped saving.\n");
    for (i=0; C[i]!=NULL; i++)
    {
        printf("%s\n", C[i]);
        free(C[i]);
    }
    free(C);
    return 0;
}
char**getData()
{
一,人,;
字符**客户端名称;
煤焦温度[60];
printf(“输入要保存的人数:”);
scanf(“%d”和人);
clientNames=malloc((people+1)*sizeof(char*);
对于(int i=0;i