malloc和指针代码演示
我没有足够的关于指针和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]; 指针实际上只是内存位置的地址 指针变量的值是指针指向的地址 将字节块
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] | .... |
+---+ +------+------+------+------+------+------+