关于#->#的问题,如何解决?

->的表示含义

img


从代码得知t[i]->name是一个指针变量
t[i]->name = malloc(sizeof(char)*64)是t[i]->name指向了在堆区开辟的64字节的空间的首地址
所以现在t[i]->name里存的应该是一个首地址
我们为什么可以直接sprintf(t[i]->name, "Teacher%d", i + 1)这样赋值而不是 *(t[i]->name)

sprintf函数的声明如下
int sprintf(char * string, char * format [,argument,...])
其中第一个参数是指向字符数组的指针,也就是一个地址
t[i]->name=&(t[i]->neme[0]),就是字符数组的第一个元素的地址
而*(t[i]->name)=t[i]->name[0],它只是字符数组neme的第一个元素值

望采纳

  • 在 C 语言中,指针变量 t[i]->name 指向的内存空间是可以被修改的。当你使用 sprintf 函数将一个字符串赋值给 t[i]->name 时,实际上就是将字符串的内容复制到 t[i]->name 指向的内存空间中。
  • 你也可以使用 *(t[i]->name) 的形式来访问 t[i]->name 指向的内存空间,那代码就会麻烦一点,如下:
*(t[i]->name) = 'T';
*(t[i]->name + 1) = 'e';
*(t[i]->name + 2) = 'a';
*(t[i]->name + 3) = 'c';
*(t[i]->name + 4) = 'h';
*(t[i]->name + 5) = 'e';
*(t[i]->name + 6) = 'r';
*(t[i]->name + 7) = '\0';

使用 sprintf 函数赋值更为方便,它可以自动在字符串末尾添加空字符。

注意,你需要先确保 t[i]->name 指向的内存空间已经足够大,否则可能会发生缓冲区溢出的问题。