为什么 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 == NULL
,str2
转换为第一个数组元素地址的类型和值。第一个数组元素(&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;
您正在尝试将指针分配给数组。
'''
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 == NULL
,str2
转换为第一个数组元素地址的类型和值。第一个数组元素(&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;
您正在尝试将指针分配给数组。