在现实生活中你需要什么案例
char *c = "Hello, world!";
超过
char c[] = "Hello, world!";
我不仅在谈论
Hello, world!
,而且在一般情况下。 \
第二个问题
在什么情况下你需要
malloc()
?
在现实生活中你需要什么情况
超过char *c = "Hello, world!";
char c[] = "Hello, world!";
区别在于你可以改变第一个
c
指向另一个字符串文字,但你不能用第二个c
来做。
考虑:
const char *c = "Hello!";
if (some_condition) c = "Goodbye!";
if (other_condition) c = "Something else";
/* more code here */
print(c);
使用数组,你必须这样编码:
const char h[] = "Hello!";
const char g[] = "Goodbye!";
const char o[] = "Something else";
/* more variants */
print(other_condition ? o : some_condition ? g : h);
这会变得非常笨拙。
在什么情况下你需要
malloc()
假设你想处理一个学生列表和他们的成绩。进一步假设您需要知道平均数、中位数和前 N 个,并且您不知道该列表是否包含 5 或 5,000,000 个条目,也不知道任何学生姓名的最大长度。
尝试在不使用
C
的情况下在malloc()
中编写一个程序来执行此操作,您将了解malloc()
的用途。
附言这只是一个例子(而且是一个微不足道的例子)。在实践中~每个不平凡的问题requires使用动态结构,这需要动态内存分配。
在 C 中,出于各种原因需要指针。如果您从编程开始,您首先会做很多可以在堆栈上完成的事情(也就是不使用
malloc()
)但是,随着程序变得越来越复杂,您将需要它。您将需要分配到堆,也就是说使用malloc()
我能想到的最好的例子是毫无疑问你需要一个指针的地方可能是一个圆形的树状节点结构(在这种情况下,这将是一个所谓的图)。例如,如果你想为一群朋友建模,当他们是朋友时,通过将他们彼此联系起来:
typedef struct {
struct Person *friends;
char* name;
} *Person;
在这里,“朋友”只能是一个指针。否则,你会将你的朋友存储在另一个节点中,并且你无法获得朋友组的复杂互连图。
换句话说:您需要更复杂数据结构的指针。一旦你足够擅长编程以需要这些数据结构,你也将需要
malloc()
.
另一个答案描述了动态大小列表(也就是编译时未知),这是另一个例子。真的,任何足够复杂的数据结构在某些时候都需要指针。