int* pInt = malloc(512);
char* pChar = malloc(512);
我很难掌握这个概念。指针类型具有相同的大小,4或8字节,具体取决于系统。 int有4个字节,char有1个字节。在这里,我为int和char类型的每个指针分配512个字节。那些指针应该具有相同的大小(内存块)。我知道它们指向不同的内存块,它们都有512个字节。但它们有何不同?
答案 0 :(得分:4)
它们都指向512字节的内存块。实际上只有两个不同之处:
1)取消引用它们时,pInt
将存储并加载整数值,而pChar
将存储和加载字符值。
2)pInt[1]
将引用内存块pInt
指向的第二个整数大小的块。 pChar[1]
将引用内存块pChar
指向的第二个字符大小的块。
所以:
*pInt = 0;
将块pInt
指向的第一个整数大小的内存块设置为整数值零。
*pChar = 0;
设置块pChar
中第一个字符大小的内存块指向的字符值为零。
答案 1 :(得分:3)
pInt
和pChar
非常相似。 (如果你查看发出的机器代码,它们可能是相同的 - 到目前为止。)
当你使用指针时会出现差异。当你说
*pChar = 0;
你会将pChar
指向的1个字节设置为0.但是当你说
*pInt = 0;
你将整个int的内存值设置为0。
答案 2 :(得分:1)
两个语句都是赋值表达式。赋值有两个方面:左边一个,表示赋值给谁,右边一个,表示要赋值的值。
在您的示例中,右侧保留记忆:malloc(512)
。这样做,没有说关于该块的使用,尤其是。关于存储什么类型的数据没有任何说法。在这两种情况下malloc(512)
都完全相同。 没有的区别。 malloc()
保留的内存块永远不会有自己的类型。
malloc()
返回指向内存块的指针。由于它不知道存储在那里的数据,这是一个空指针,一个"无类型"指针。将其分配给类型指针将产生效果:
首先,你将语义带入其中。没有人可以说,malloc()
返回地址的块中存储了哪种数据。当你将它分配给一个int指针时,它会说:"该块中存有一些int。"带有char指针的模拟。
其次,当你对它进行操作时,你告诉编译器有关存储在那里的数据:I。e。如果使用char指针将值存储到内存块中pChar
,则只会阻止块的一个字节。这是因为字符的大小只有一个字节。
如果使用int指针将值存储到内存块中{4},则会影响4或8(或计算机上的任何内容)。
但这取决于你引用内存块的方式,指针的类型。内存块本身仍然是无类型的。因此,您可以更改类型:
pInt
因此,内存块没有任何类型。指向内存块内存的指针为块的访问提供了一种类型。该块本身是无类型的。
答案 3 :(得分:0)
int *pInt = malloc(512)
与int pInt[128];
char *pChar = malloc(512)
与char pChar[512];
注意整数是4个字节大,512/4 = 128.(有时整数不是4个字节。这取决于编译器。)
块本身并没有什么不同。相反,它们不同的类型会影响编译器处理这些内存块的方式。编译器不允许您在类型之间自由切换,但无论如何都可以通过类型转换进行切换,例如(char *)pInt;
。
以下是操纵pInt
和pChar
以展示其关系的一些代码。请注意使用类型转换以避免编译器错误。
#include <stdio.h>
#include <stdlib.h>
static const int BLOCKSIZE = 8;
void print_as_chars(char *print_me)
{
int i;
for (i = 0; i < BLOCKSIZE; ++i)
{
printf ("%4d ", print_me[i]);
}
printf ("\n");
}
void print_as_ints(int *print_me)
{
int i;
for (i = 0; i < BLOCKSIZE / sizeof(int); ++i)
{
printf ("%19d ", print_me[i]);
}
printf("\n");
}
int main (void)
{
int *pInt = malloc(BLOCKSIZE);
char *pChar = malloc(BLOCKSIZE);
// We can set any value in pInt
pInt[0] = 25;
pInt[1] = 300;
// But represent the memory in any way we want.
printf ("pInt:\n");
print_as_ints(pInt); // 25 300
print_as_chars((char *)pInt); // 0 0 0 25 0 0 1 44
printf ("\n");
// It works both ways!
pChar[0] = 0; pChar[1] = 0; pChar[2] = 0; pChar[3] = 25;
pChar[4] = 0; pChar[5] = 0; pChar[6] = 1; pChar[7] = 44;
printf ("pChar:\n");
print_as_ints((int *)pChar); // 25 300
print_as_chars(pChar); // 0 0 0 25 0 0 1 44
printf ("\n");
return 0;
}