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

Why does the char pointer not get updated to NULL

'''

void calling (char *str)
{

    str = NULL;
    
}

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

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


    return 0;
}

'''

只是想知道为什么 printf 没有 run.Can 我没有在声明后将字符数组指针更改为 NULL。

代码中有很多问题:

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

您更改了对调用者不可见的 str 的本地副本。 你可以只用一个普通的 return NULL; 来达到同样的效果。

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

如上所述,函数的参数在函数外部不受影响。 您也不要对 return 值执行任何操作。 NULL 值刚刚被丢弃。 main 中根本没有可以更新的指针。

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

如评论中所述,您应该获得一本学习 C 的好书。 特别是关于数组、指针和将数据传入和传出函数的章节应该与您相关。

Why does the char pointer not get updated to NULL

结论不正确。在 calling(char *str) 中,指针 str 确实更新为 NULL


Just wondering why did the printf not run.

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

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

Can I not change the char-array pointer to NULL once its declared.

“字符数组指针”不清楚。

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

Pointer str in char *str ... str = NULL; 可以赋值给 NULL.


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

void calling(char *str) 收到该指针的 copy。由于 calling() 在自身内部更改了指针副本 str,因此它不会影响调用代码的 str2.

的地址

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

对于初学者,您有一个数组

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

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

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

#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;

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