求问C语言解析int *t; t=(int *)malloc(2 * sizeof(int)); *t=*p1+*p1++; *(t+1)=*p1+*p1; s=t; C语言二维数组a=(int **) malloc(sizeo...

作者&投稿:曲子 (若有异议请与网页底部的电邮联系)
#include <stdio.h>
#include <stdlib.h>
//p1和s是指向整型变量的指针。
void fun(int *p1,int *s)
{
int *t;
//在堆中分配2个整型类型大小的存储空间,令t指向此空间的首地址。
t=(int *)malloc(2 * sizeof(int));
//令第1个整型空间存储p1指向的变量的值的两倍(当在下面的main函数中调用此函数时,p1指向数组a的首元素a[0],因此t指向的第1个整型空间存储的是a[0]的两倍2),并使p1指向下一个元素(对于下面的调用而言是指向a[1])。
*t=*p1+*p1++;
//令第2个整型空间存储p1指向的变量的值的两倍(对于下面的调用而言是a[1]的两倍4)。
*(t+1)=*p1+*p1;
//令s指向t指向的堆空间,s在下面的调用中本来是指向数组b的首元素b[0]的,这里的赋值并不会改变数组b的任何元素的值。
要将数组b的两元素的值改成2 4,可以这样:s[0]=t[0];s[1]=t[1];。
s=t;
}
main()
{
int a[2]={1,2},b[2]={0};
fun(a,b);
//输出0,0。因为上面的函数调用并没有改变数组b的任何元素的值。
printf("%d,%d\n",b[0],b[1]);
}

输出0,0
也就是b[0] = 0;
b[1] = 0;
因为函数fun对指针s的修改无法返回到调用处,也就是b数组保持不变

s=t 这句有问题,s就是b的值,也就是数组地址,而数组地址是常量,不能被赋值。

C语言p1=(int *)malloc(sizeof(int))作用与意思是什么~

p1=(int *)malloc(sizeof(int));语句是给指针变量p分配一个整形数据空间。
C语言中定义指针变量后,必须给指针变量进行相应的地址分配,才可以使用指针变量,否则会出现程序异常。常见的指针地址分配方法为:
int *p1; //定义指针变量p1,未初始化
(1)
int x =5;
p1=&x ; //给指针变量分配一个已存在的相应类型的变量的地址,即p1指向x所在的位置。
(2)
p1=(int *)malloc(sizeof(int)); //让系统为p1选择一个内存空间
其中,malloc()是系统动态分配内存的函数,其函数原型为:
void * malloc( int size );
void *表示函数返回值为任意类型,即malloc可为任意类型数据分配内存空间
参数size是指分配的内存单元字节数

接下来就可以通过指针变量p1进行数据操作了,如:*p1 = 10 ;
注意,当p1未分配内存地址时(称为野指针),*p1操作会导致程序崩溃。

a=(int **) malloc(sizeof(int *) * r)
首先,这句话的意思就是使用malloc申请 sizeof(int*)*r这么大的内存空间。
其次,因为mallo的返回值是void*类型,所以要进行一个类型转换,你可以转换成任何的类型。
最后,因为你要输出一个3*5的矩阵,所以如果直接定义的话,应该定义为int a[3][5], 而这个a就是int ** 类型,所以你使用malloc分配内存值,要将malloc的内存类型格式化为int ** 类型。
int** p;
int a[3][5];
p = a; //可以这样赋值的。

输出一个3*5数列的例子
#include #include int main(){ int** a = (int**)malloc(sizeof(int*)*3);int i=0, j=0;for (i=0; i<3; i++){a[i] = (int*)malloc(sizeof(int)*5);for (j=0; j<5; j++){*(*(a+i)+j)=j;}}for (i=0; i<3; i++){for (j=0; j<5; j++){printf("%d", *(*(a+i)+j));}printf("
");}delete[] a; return 0;}