Belows是一个简单的代码,可以找到指向数组的指针.
#include <stdio.h>
typedef unsigned short int Ushort;
void InputYear(char (*name), Ushort *year);
int main(int argc, const char * argv[]) {
Ushort year;
char name[11] ;
InputYear(name, &year);
printf("MY name is %s", message);
printf("%d", year);
}
void InputYear(char (*name), Ushort *year){
printf("please enter your name and year");
scanf("%s %hd" ,name, year);
}
Run Code Online (Sandbox Code Playgroud)
但问题是,如果我改变,为什么它不起作用char name[11]- > char *name?
错误是"分段错误:11".
我了解到数组的名称也是一个指针,指示第一个数组值的地址.在这方面,我认为char name[11]并且char *name是一样的.
或者有什么我不知道的吗?
和额外的问题:
int a = 1;
int* b = &a;
printf("%s", *b);
Run Code Online (Sandbox Code Playgroud)
有用.关键是printf的第二个参数是值本身,而不是地址.但,
char hi[11] = "message";
printf("%s", hi);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,printf的第二个参数是地址本身,而不是像上面那样的值.它是什么??为什么会这样?
非常感谢!
因为
char name[11];
Run Code Online (Sandbox Code Playgroud)
意味着创建一个11字符数组,而
char *name;
Run Code Online (Sandbox Code Playgroud)
意思是,创建一个指针并稍后在某处指向它,然后你可以这样做
name = malloc(11);
Run Code Online (Sandbox Code Playgroud)
这将指向一个11字符的记忆块.
当你调用scanf它时,期望参数指向有效的内存来写入它.
因此,如果指针未初始化,您不知道它指向的位置,malloc让您访问内存并返回指向它的指针,您将该指针指定给name然后name变为可写但不可读.
它指向的内容尚未定义,因此您需要初始化它的内容,因为您可以使用它
scanf("%10s", name);
Run Code Online (Sandbox Code Playgroud)
注意"%10s"你防止写入超过允许的内存的方式,它malloc对于数组和数组都是有用的.
注意:scanf("%10s", name);数字应该是数组可以容纳的字符数-1,因为你需要一个额外的字符,终止'\0'.
在任何调用之后malloc你应该承担两个责任,首先你必须确保有有效的内存指向,相反的情况下malloc将返回一个特殊的值NULL,因此正确的调用malloc将是
name = malloc(11);
if (name == NULL)
handleThisAndDontTryToUse_name_Anywhere();
Run Code Online (Sandbox Code Playgroud)
第二件事是,系统将获得指针指向的内存的所有权,直到您决定可以释放它为止,您需要调用它 free()
/* after you are done using the block of memory */
free(name);
Run Code Online (Sandbox Code Playgroud)
如果是
char name[11];
Run Code Online (Sandbox Code Playgroud)
你不必担心这些事情.
你可以做的三件事就是创建数组并用char *name;我的意思指向它
char array[11];
char *name = array;
Run Code Online (Sandbox Code Playgroud)
现在name是指向array问题文本的第一个元素的指针,我相信你明白这意味着什么.