Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc和指针代码演示_C_Pointers_Malloc_Mergesort - Fatal编程技术网

malloc和指针代码演示

malloc和指针代码演示,c,pointers,malloc,mergesort,C,Pointers,Malloc,Mergesort,我没有足够的关于指针和malloc的知识!我试着读一些书,但读得不清楚,我无法理解以下几行代码: L = (int*)malloc(mid*sizeof(int)); R = (int*)malloc((n- mid)*sizeof(int)); 实际上L和R有什么值 for(i = 0;i<mid;i++) L[i] = A[i]; for(i = mid;i<n;i++) R[i-mid] = A[i]; 指针实际上只是内存位置的地址 指针变量的值是指针指向的地址 将字节块

我没有足够的关于指针和malloc的知识!我试着读一些书,但读得不清楚,我无法理解以下几行代码:

L = (int*)malloc(mid*sizeof(int));
R = (int*)malloc((n- mid)*sizeof(int));
实际上
L
R
有什么值

for(i = 0;i<mid;i++) L[i] = A[i]; 
for(i = mid;i<n;i++) R[i-mid] = A[i];

指针实际上只是内存位置的地址

指针变量的值是指针指向的地址

将字节块分配到内存中的某个位置(该内存所在的位置与此无关)。它返回指向该内存第一个字节的指针


从视觉上看,指针及其指向的对象可以如下所示:

+---------+ +------------+ | pointer | ---> | Memory ... | +---------+ +------------+ 也就是说,变量
L
指向分配的“数组”中的第一个元素(
L[0]

请注意,
malloc
分配的“数组”实际上没有尽头。C没有任何边界检查,编译器不会因为使用超出边界的索引而给您任何错误或警告(例如
L[5]
使用上面的out示例)。它将导致未定义的行为,可能会导致崩溃或奇怪的行为,但您仍然可以访问甚至写入该元素

还请注意,使用
sizeof
运算符获取指针的大小不会返回指针指向的内存大小,而是返回指针本身的大小。例如,执行
sizeof L
将不会返回
mid
mid*sizeof(int)
。它将返回指针变量
L
,通常为
4
8
,具体取决于您使用的是32位还是64位系统

L和R的实际值是多少

它们保存刚刚分配给我们的
malloc
内存块的起始地址

您可以将
malloc
看作是在某处创建一个新变量(它没有名称);由于我们两次调用了
malloc
,它创建了两个,并且
L
R
指向它们。您不能直接使用这些“变量”,因为它们没有名称,但您可以使用
*L
*R

在for循环中,我看到L和R有索引no?我搞不懂为什么L和R会充当数组

在C语言中,
a[b]
*(a+b)
的缩写。因此
L[i]
*(L+i)

malloc()的缩写,它返回指向您请求的块的起始点的指针(即内存地址)。因此,L和R是两个块的地址,这里用于存储数组A的左半部分和右半部分。
由于地址类型转换为整数指针,因此现在将该内存块视为整数数组。i、 e如果您要求输入40个字节,并且将malloc()返回的地址类型转换为(int*),那么您将看到一个包含10个整数的数组(假设一个整数的大小为4个字节)

现在,由于您有了指向第一个整数的起始地址L,现在可以使用简单的指针操作遍历数组。L[i]与*(L+i)相同,它对应于数组L中的第i个整数。

指针只不过是一个变量,它将其他对象的地址作为其值,而不是像
5
这样的立即值。例如
inta=5
创建变量
a
,该变量保存立即值
5
。现在
int*b=&a
创建整数指针
b
,该指针将
a
的地址作为其值
b
是指向
a
的指针。另外,不要强制执行malloc的返回,这是不必要的。请参阅:以获得详细解释。换句话说,
L=malloc(mid*sizeof*L)
是为
mid
整数分配存储所需的全部内容。“我试图阅读书籍,但没有弄清楚”——你正在阅读哪些书籍?你所问的是一些基本问题,阅读一本好的教科书来理解这些概念是很重要的。试试Kernighan和Ritchie的“C编程语言”,我读的是deitel C第六版。在这里,作者没有展示任何像我所面对的代码中那样的指针示例!我读了一章!从书上看。你可以看一看或者给我推荐一本好书。谢谢 +---------+ +------------+ | pointer | ---> | Memory ... | +---------+ +------------+ +---+ +------+------+------+------+------+------+ | L | ---> [ L[0] | L[1] | L[2] | L[3] | L[4] | .... | +---+ +------+------+------+------+------+------+