C 指针和数组在内存方面的差异
我知道第二个的内存已经在缓冲区中分配了。但是,我不知道指针在内存分配方面是如何工作的。在程序员使用malloc或calloc分配指针之前,指针最初需要多少空间?另外,如果我像这样初始化它C 指针和数组在内存方面的差异,c,memory,C,Memory,我知道第二个的内存已经在缓冲区中分配了。但是,我不知道指针在内存分配方面是如何工作的。在程序员使用malloc或calloc分配指针之前,指针最初需要多少空间?另外,如果我像这样初始化它 char* pointer; char array[10]; 如果在使用随机字符串大小初始化内存之前没有分配内存,那么如何初始化它?不会有任何错误吗 我只是机械地用指针和数组编程,不知道它在计算机内部是如何工作的。而且,我认为我应该完全理解这一点,以便更好地进行编程实践 本声明: char* pointer;
char* pointer;
char array[10];
如果在使用随机字符串大小初始化内存之前没有分配内存,那么如何初始化它?不会有任何错误吗
我只是机械地用指针和数组编程,不知道它在计算机内部是如何工作的。而且,我认为我应该完全理解这一点,以便更好地进行编程实践
本声明:
char* pointer;
pointer = "Hello World!";
char *pointer;
为指针值保留sizeofchar*字节。没有分配其他内存
本声明:
char* pointer;
pointer = "Hello World!";
char *pointer;
为数组保留10个字节
在这种情况下:
char array[10];
您仍然有一个大小为sizeofchar*的单指针,它指向内存中某个字符串文本——没有其他分配。字符串文本的存储由您的工具链在编译时计算出来
本声明:
char* pointer;
pointer = "Hello World!";
char *pointer;
为指针值保留sizeofchar*字节。没有分配其他内存
本声明:
char* pointer;
pointer = "Hello World!";
char *pointer;
为数组保留10个字节
在这种情况下:
char array[10];
您仍然有一个大小为sizeofchar*的单指针,它指向内存中某个字符串文本——没有其他分配。字符串文本的存储由您的工具链在编译时计算出来
指针占用描述内存位置所需的任何空间。通常,指针的大小与处理器/OS/程序模式e的位大小相同,但并不总是如此。G64位操作系统上的64位程序为8字节,32位程序为4字节,等等。。您可以使用
char *pointer;
pointer = "Hello World!";
就
sizeof (void *)
您将在R/W内存中分配一个指针,再加上字符串13字节的空间,包括R/O内存中的尾随空字节,如果内存中的下一个对象在比字节边界更好的位置对齐,可能会更多。请注意,相同的R/O空间将分配给
char* pointer;
pointer = "Hello World!";
这实际上与指针无关。事实上,大多数优化编译器都会注意到这两个字符串完全相同,只在R/O内存中分配一次。指针会占用描述内存位置所需的任何空间。通常,指针的大小与处理器/OS/程序模式e的位大小相同,但并不总是如此。G64位操作系统上的64位程序为8字节,32位程序为4字节,等等。。您可以使用
char *pointer;
pointer = "Hello World!";
就
sizeof (void *)
您将在R/W内存中分配一个指针,再加上字符串13字节的空间,包括R/O内存中的尾随空字节,如果内存中的下一个对象在比字节边界更好的位置对齐,可能会更多。请注意,相同的R/O空间将分配给
char* pointer;
pointer = "Hello World!";
这实际上与指针无关。事实上,大多数优化编译器都会注意到这两个字符串完全相同,只在R/O内存中分配一次
我不知道指针在内存分配方面是如何工作的。在程序员使用malloc或calloc分配指针之前,指针最初需要多少空间
指针本身只是一种数据类型,如int、char等。
它指向内存地址或NULL
它可以是malloc,成为指向您请求的内存块的指针
您很可能弄错了指针=malloc,它不是
我不知道指针在内存分配方面是如何工作的。在程序员使用malloc或calloc分配指针之前,指针最初需要多少空间
指针本身只是一种数据类型,如int、char等。
它指向内存地址或NULL
它可以是malloc,成为指向您请求的内存块的指针
您很可能错误地认为pointer=malloc,事实并非如此。当您在c中定义指针时,例如char*c;或int*i它将保留一个分别等于sizeofchar*和sizeofint*的内存 但实际保留的内存取决于您的系统/操作系统,如果是64位,它将保留8个字节,如果是32位,它将保留4个字节 如果声明char*c=Hello world
字符串helloworld可以存储在内存中的任何位置,但这里c指向字符串的第一个字符“H” 在c中定义指针时,例如char*c;或int*i它将保留一个分别等于sizeofchar*和sizeofint*的内存 但实际保留的内存取决于您的系统/操作系统,如果是64位,它将保留8个字节,如果是32位,它将保留4个字节 如果声明char*c=Hello world 字符串helloworld可以存储在内存中的任何位置,但这里c指向字符串的第一个字符“H” ch ar阵列[10], 它将在声明它的函数的堆栈帧上保留10字节的内存 而在char*ptr=hello中,ptr将以32位O.S在堆栈上获得4字节的内存,hello也是字符串文字,它将存储在可执行文件的非bss部分,ptr从堆栈帧指向它。char array[10], 它将在声明它的函数的堆栈帧上保留10字节的内存
而在char*ptr=hello中,ptr将以32位O.S在堆栈上获得4字节内存,hello也是字符串文字,它将存储在可执行文件的非bss部分,ptr从堆栈帧指向它。指针和数组是完全不同的东西。两者之间的任何相似和混淆都是C语言的产物 指针是保存另一个变量位置的变量。C中的数组是在内存中连续分配的相同类型的值的集合 数组通过指向基元素[0]的指针通过算术进行访问。如果对引用数组的表达式求值,则出现的值是指向元素[0]的指针 C中的数组表示法是一种假符号,它实际上与指针一起工作。语法E1[E2]与*E1+E2的意思相同,假设E1和E2被充分地括起来,这样我们就不必被关联性和优先级分散注意力。当我们通过&E1[E2]获取元素的地址时,这与&E1+E2相同。的地址和取消引用取消,留下E1+E2。因此,这些也是等效的:
int array[10];
int *p = array; /* array expression yields pointer to array[0] */
int *q = &array[0]; /* q also points to same place as p */
因为数组[i]和指针[i]都是有效的语法,新手阶段的人将语法误认为是语义,从而得出结论,数组和指针在某种程度上是相同的
花些时间用汇编语言编程。在汇编语言中,您可以这样定义一些存储:
int *r = array + 3;
int *q = &array[3];
A: DFS 42 ;; define 42 words, labelled as A.
然后像这样使用它:
int *r = array + 3;
int *q = &array[3];
A: DFS 42 ;; define 42 words, labelled as A.
R13指向存储器。这并不意味着A是指针。A是存储的名称。当然,要使用存储,我们需要它的有效地址,因此对a的引用可以解决这个问题。当代码被组装和链接时,MOV指令最终会将一些数字地址加载到R13中
C只是一种更高级的汇编语言。数组类似于命名存储器,解析为指针数据类型的有效地址
数组并不总是解析到其有效地址。sizeof a计算数组a的大小(以字节为单位),而sizeof p计算指针数据类型p的大小
另一个区别是,数组的名称不能表示该数组以外的任何位置,而我们可以为指针赋值:
MOV R13, A ;; address of A storage is moved into R13
MOV R1, [R13 + 3] ;; load fourth word, A[3]
指针和数组是完全不同的东西。两者之间的任何相似和混淆都是C语言的产物 指针是保存另一个变量位置的变量。C中的数组是在内存中连续分配的相同类型的值的集合 数组通过指向基元素[0]的指针通过算术进行访问。如果对引用数组的表达式求值,则出现的值是指向元素[0]的指针 C中的数组表示法是一种假符号,它实际上与指针一起工作。语法E1[E2]与*E1+E2的意思相同,假设E1和E2被充分地括起来,这样我们就不必被关联性和优先级分散注意力。当我们通过&E1[E2]获取元素的地址时,这与&E1+E2相同。的地址和取消引用取消,留下E1+E2。因此,这些也是等效的:
int array[10];
int *p = array; /* array expression yields pointer to array[0] */
int *q = &array[0]; /* q also points to same place as p */
因为数组[i]和指针[i]都是有效的语法,新手阶段的人将语法误认为是语义,从而得出结论,数组和指针在某种程度上是相同的
花些时间用汇编语言编程。在汇编语言中,您可以这样定义一些存储:
int *r = array + 3;
int *q = &array[3];
A: DFS 42 ;; define 42 words, labelled as A.
然后像这样使用它:
int *r = array + 3;
int *q = &array[3];
A: DFS 42 ;; define 42 words, labelled as A.
R13指向存储器。这并不意味着A是指针。A是存储的名称。当然,要使用存储,我们需要它的有效地址,因此对a的引用可以解决这个问题。当代码被组装和链接时,MOV指令最终会将一些数字地址加载到R13中
C只是一种更高级的汇编语言。数组类似于命名存储器,解析为指针数据类型的有效地址
数组并不总是解析到其有效地址。sizeof a计算数组a的大小(以字节为单位),而sizeof p计算指针数据类型p的大小
另一个区别是,数组的名称不能表示该数组以外的任何位置,而我们可以为指针赋值:
MOV R13, A ;; address of A storage is moved into R13
MOV R1, [R13 + 3] ;; load fourth word, A[3]
指针仅用于存储一个变量的地址。i、 如果你说char,它存储一个字符的地址。如int i=9;意味着sizeofint的内存被保留并标记为程序中的i。 像wise char*c;表示sizechar*的内存被保留并标记为c;在c=你好;h、 e,l,l,o得到了独立的连续内存分配。指针c指向第一个字符H 在内存中考虑HELLO是字符串之前的存储 你好 对于char*c=HELLO;c[5]返回I。
对于char c[5]=HELLO;c[5]是数组越界错误。指针仅用于存储一个变量的地址。i、 如果你说char,它存储一个字符的地址。如int i=9;意味着sizeofint的内存被保留并标记为程序中的i。像wise char*c;表示sizechar*的内存被保留并标记为c;在c=你好;h、 e,l,l,o得到了独立的连续内存分配。指针c指向第一个字符H 在内存中考虑HELLO是字符串之前的存储 你好 对于char*c=HELLO;c[5]返回I。
对于char c[5]=HELLO;c[5]是数组越界错误。是否阅读了c常见问题解答?阅读了本教程c中指针和数组的教程是否阅读了c常见问题解答?阅读了本教程c中指针和数组的教程如果*指针在内存中保留了8字节,则该指针上只能初始化8字节的字符串?否,您可以随意调用内存,并将指向它的指针存储到指针变量中。为指针本身保留的内存和为指针指向的任何对象分配的内存几乎完全不相关。如果*指针在内存中保留8字节,则该指针上只能初始化8字节的字符串?不,您可以随意调用内存,并将指向它的指针存储到指针变量中。为指针本身保留的内存和为指针指向的任何对象分配的内存几乎完全不相关。挑剔:严格来说,指针大小与处理器的字大小无关,在给定的机器上,所有不同的指针大小都必须相同。挑剔:严格来说,指针大小与处理器的字大小无关,在给定的机器上,所有不同的指针大小都必须相同。