为什么 char 指针没有更新为 NULL

Why does the char pointer not get updated to NULL

提问人:C-ode Menon 提问时间:7/22/2021 最后编辑:Vlad from MoscowC-ode Menon 更新时间:7/23/2021 访问量:171

问:

'''

void calling (char *str)
{

    str = NULL;
    
}

int main()
{
    char str2[20];
    calling(str2);

    if(str2 == NULL)
    {
        printf("null");
    }


    return 0;
}

'''

只是想知道为什么 printf 没有运行。一旦声明,我是否可以不将 char-array 指针更改为 NULL。

数组 C 指针 隐式转换 传递

评论


答:

0赞 Gerhardh 7/22/2021 #1

代码中存在许多问题:

char* calling (char *str)
{
    str = NULL;
    return str;
}

更改调用方不可见的本地副本。 你可以让一个普通的有同样的效果。strreturn NULL;

int main()
{
    char str2[20];
    calling(str2);

如上所述,函数的参数在函数之外不受影响。 您也不对返回值执行任何操作。该值只是被丢弃。 此外,根本没有可以更新的指针。NULLmain

你有一个数组。数组不是指针,指针也不是数组。 永远不能为数组变量赋值,因为它表示内存中存储数组成员的位置。

正如评论中提到的,你应该拿到一本好书来学习 C。 特别是关于数组、指针和将数据传入和传出函数的章节应该与你相关。

评论

0赞 C-ode Menon 7/22/2021
所以。。我知道当你在 c 中传递一个数组时,整个数组不会被复制,而是数组分解为指针。由于它更像是通过指针/引用传递,因此我们能够在函数调用中更改数组的值。(它不会是本地副本吗?我想知道的是,如果我尝试在函数调用中更新指针指向的地址,C 如何强制执行数组分解指针与整数指针之间的区别..!
1赞 Gerhardh 7/22/2021
你对传递数组的看法是对的。而不是所有元素,只传递指向第一个元素的指针。这称为“数组衰减为指针”。因此,我们确实可以修改该数组中的值。如果它是传递给函数的指针,它也将是本地副本。但是,无论哪种情况,您都无法修改该指针。它只影响被调用函数内部的指针。
1赞 Gerhardh 7/22/2021
这意味着如果要更新指针本身,则必须通过引用传递指针,即使用 .然后你可以更新 .由于数组不是指针,因此不能将数组传递到需要指针地址的函数中。int **param*param=new_addr;
1赞 chux - Reinstate Monica 7/22/2021 #2

为什么 char 指针没有更新为 NULL

错误的结论。在里面,指针确实更新到了 。calling(char *str)strNULL


只是想知道为什么 printf 没有运行。

因为不是.
是一个数组,而不是指针。With ,转换为第一个数组元素的地址的类型和值。第一个数组元素 () 的地址不是 。
&str2[0]NULLstr2str2 == NULLstr2&str2[0]NULL

char str2[20];
...
if(str2 == NULL)
{
    printf("null");
}

一旦声明,我是否可以不将 char-array 指针更改为 NULL。

“char-array pointer”不清楚。

中的数组无法更改为 。数组的地址永远不会更改。str2char str2[20];NULL

指针可以分配给 。strchar *str ... str = NULL;NULL


calling(str2);将数组转换为第一个数组元素的地址的类型和值,就像是一样,并将该指针传递给 。str2calling(&str2[0]);calling()

void calling(char *str)接收该指针的副本。当该指针副本在自身内部发生变化时,它不会影响调用代码的 .calling()strstr2


请记住:数组不是指针。指针不是数组。

0赞 Vlad from Moscow 7/23/2021 #3

对于初学者来说,你有一个数组

char str2[20];

也就是说,它不是一个指针,而是一个数组。数组是不可修改的左值。您不能将一个数组分配给另一个数组,例如str2

char str1[20];
char str2[20];

str1 = str2;

在此函数中调用

calling(str2);

数组指示符隐式转换为指向数组第一个元素的指针,并表示右值。您可以按如下方式想象函数定义及其调用str2

calling(str2);

//...

void calling ( /*char *str*/)
{
    char *str = str2;
    str = NULL;

}

正如你所看到的,该函数处理一个表达式的值的副本,该表达式产生数组第一个元素的地址值。str2

在函数中,更改的是局部变量(指针)。在 main 中声明的原始数组保持不变。strstr2

即使您将通过引用传递数组,也无法更改它。例如,这个程序不会编译

#include <stdio.h>

void calling (char ( *str )[20] )
{

    *str = NULL;
    
}

int main()
{
    char str2[20];
    calling( &str2 );

    if(str2 == NULL)
    {
        printf("null");
    }


    return 0;
}

因为在这个声明中

    *str = NULL;

您正在尝试将指针分配给数组。