![]() |
1
33
我想这可以这样解释,因为一幅画抵得上千言万语。。。
char name[] = "Fortran"; +======+ +-+-+-+-+-+-+-+--+ |0x1234| |F|o|r|t|r|a|n|\0| +======+ +-+-+-+-+-+-+-+--+
在链接时,编译器和链接器给出了符号
如果
printf("The address of name is %p\n", &name); Output would be: The address of name is 0x00001234 为了简洁起见并与示例保持一致,内存地址为32位,因此您可以看到额外的0。公平吗?好的,让我们继续。
编辑: 我们将其初始化为NULL,如图所示 谢谢Dan指出了这个小错误。。。 char *name = (char*)NULL; +======+ +======+ |0x5678| -> |0x0000| -> NULL +======+ +======+
现在,记住 这是至关重要的,在编译/链接时,符号的地址是已知的,但在处理任何类型的指针时,指针地址是未知的 假设我们这样做: name = (char *)malloc((20 * sizeof(char)) + 1); strcpy(name, "Fortran");
char *name; +======+ +======+ +-+-+-+-+-+-+-+--+ |0x5678| -> |0x9876| -> |F|o|r|t|r|a|n|\0| +======+ +======+ +-+-+-+-+-+-+-+--+ 所以当你这样做的时候: printf("The address of name is %p\n", name); printf("The address of name is %p\n", &name); Output would be: The address of name is 0x00005678 The address of name is 0x00009876 数组和指针是一样的,在这里起作用 '
char ch = name[1]; 运行时发生的情况如下:
上面这一点对于理解这种区别是至关重要的,数组和指针之间的区别在于运行时如何获取数据,使用指针时,有一个额外的间接获取。 ,一系列 将始终衰减为的第一个元素的指针 T型 当我们这样做时: char ch = *(name + 5);
顺便说一下,您也可以对字符数组执行此操作。。。
name[3] is the same as *(name + 3)
自从那句话
*(subscript_value + name) is the same as *(name + subscript_value) 尽管如此,这种做法并不推荐,即使它是相当合法的! ) 3[name]
好的,我如何得到指针的值?
这就是问题所在
char ch = *name;
这意味着,现在获取内存地址0x9878指向的值
而且,编译器知道
*name++; *name--; 指针会自动向上/向下移动一步。 执行此操作时,假设指针内存地址为0x9878: char ch = *name++;
*name的值是多少?地址是多少?答案是
现在,如果我们释放
+======+ +======+ |0x5678| -> |0x0000| -> NULL +======+ +======+
是的,内存块被释放并返回到运行时环境,以供另一个即将执行的代码使用
现在,这就是
char ch=*名称;
这就是指针的工作原理,数组与指针的区别,如果你在读一本说它们是一样的教科书,就把那一页撕下来撕碎吧!:) 我希望这对你理解指针有帮助。 |
![]() |
2
3
实际上,它本身无法容纳大量字符。它本身只能在内存中保存一个地址。如果在创建时为其分配字符,它将为这些字符分配空间,然后指向该地址。您可以这样做:
这实际上与此基本相同:
动态内存是字符指针派上用场的地方。您可以在程序中的任何时间通过以下操作将任意长度的字符串分配给char指针:
或者,您可以使用
如果以这种方式使用字符指针并为其分配内存,则必须在重新分配它之前释放名称中包含的内存。这样地:
在尝试释放其内存之前,请确保检查名称实际上是一个有效点。这就是if语句的作用。 您看到字符指针在C中大量使用的原因是,它们允许您使用不同大小的字符串重新分配字符串。静态字符数组不能做到这一点。它们也更容易传递。
这是在将静态分配的数组传递给使用字符指针的函数时经常发生的情况。例如:
如果您随后通过:
它将通过str1和str2操作这两个函数,str1和str2只是指向缓冲区和字符串文本存储在内存中的指针。
那不行。在这种情况下,您必须使用指针并分配内存(如前面所示)。分配的内存将保持不变,即使您超出了函数范围。只是别忘了像前面提到的那样释放它。 这篇文章比我想象的要更加百科全书,希望能有所帮助。 编辑删除C++代码。我经常把这两者混在一起,有时会忘记。 |
![]() |
3
2
char*name只是一个指针。必须在线路的某个地方分配内存,并将该内存的地址存储在 名称
|
![]() |
4
2
|
![]() |
5
2
这确实令人困惑。需要理解和区分的重要事情是
但如果你申请
此外,char元素数组的两种定义形式是等效的:
|
![]() |
6
2
在C语言中,字符串实际上只是一个字符数组,正如定义所示。然而,从表面上看,任何数组都只是指向其第一个元素的指针,请参见下文了解微妙的复杂性。在C中没有范围检查,变量声明中提供的范围仅对变量的内存分配有意义。
如果您使用以下选项:
为了避免混淆并避免误导他人,请在指针和数组之间更为复杂的区别上多说几句,谢谢avakar:
最后是一些有趣的琐事;自从
|
![]() |
7
1
一个是实际的数组对象,另一个是 参考 或 指针 令人困惑的是,两者都有第一个字符的地址,但这仅仅是因为一个地址 是
差异可以从
|
![]() |
Dima Malko · 如何在指定符号前添加符号? 2 年前 |
![]() |
shekharsabale · 从列表元素捕获子字符串 2 年前 |
![]() |
Manny · 如何比较Perl中的字符串? 2 年前 |
![]() |
Manan Girdhar · 拆分字符串并仅在java中使用第二部分 2 年前 |
![]() |
AnxiousLuna · Python使用len()获取数组索引数 2 年前 |
![]() |
antonoyaro8 · 数据帧中每列上的Grepl 2 年前 |