当前位置:首页 » 编程语言 » c语言动态参数

c语言动态参数

发布时间: 2022-10-01 18:43:27

⑴ 如何在c语言的程序中将动态分配的二维数组当做一个参数传入某个函数

我不明白,如果两个维度都不是事先确定,你上面要怎么定义?

arr[][4];

好吧,如果你说的那个可行

那就传那两个维度进去。
前面arr[i][j]
那么就void func(int i,int j,int num)
我不敢保证在func里面使用到arr[][]的时候貌似能直接使用arr[i][j],我记得这样用会出错。
所以你要运算那个地址。
你想要的比如是5行4列的 arr[5][4]
你要第第二行第二个数
那么就要*(arr+(2-1)*4+2),这样来得到数字

如果你事先就知道这个维度的话,
直接设定个全局变量
然后连数组都不用传进去就可以直接运算的。
数组是记录地址的,会直接修改在原来的地方

⑵ C语言 动态二维数组能否做函数参数

二级指针用的没有错,但是这两部分要换换位置
for(t=0;t<m;t++)
a[t]=(float *)malloc(m*sizeof(float));

if(*a==NULL)
{
printf("out of menory,press any key to....");
exit(0);
}
应该先检查申请二级指针内存成功与否再使用,而且应该是if(a==NULL),而不是if(*a==NULL)

void search_1(float *p1,int n,int m)
这个函数是想查找在这个方阵中的最大值吧?那么应该这样:
void search_1(float **p1,int n,int m)

里面怎么实现,你应该会的,你用二级指针很熟练的,理解很正确

⑶ c语言中函数可否改变参数值

#include
void
foo(int
x,
int
y,
int
z)
{
printf("x
=
%d
at
[%x]n",
x,
&x);
printf("y
=
%d
at
[%x]n",
y,
&y);
printf("z
=
%d
at
[%x]n",
z,
&z);
}
int
main(int
argc,
char
*argv[])
{
foo(100,
200,
300);
return
0;
}
运行结果:
x
=
100
at
[bfe28760]
y
=
200
at
[bfe28764]
z
=
300
at
[bfe28768]
c程序栈底为高地址,栈顶为低地址,因此上面的实例可以说明函数参数入栈顺序的确是从右至左的。可到底为什么呢?查了一直些文献得知,参数入栈顺序是和具体编译器实现相关的。比如,pascal语言中参数就是从左到右入栈的,有些语言中还可以通过修饰符进行指定,如visual
c++.即然两种方式都可以,为什么c语言要选择从右至左呢?
进一步发现,pascal语言不支持可变长参数,而c语言支持这种特色,正是这个原因使得c语言函数参数入栈顺序为从右至左。具体原因为:c方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数。通过栈堆分析可知,自左向右的入栈方式,最前面的参数被压在栈底。除非知道参数个数,否则是无法通过栈指针的相对位移求得最左边的参数。这样就变成了左边参数的个数不确定,正好和动态参数个数的方向相反。
因此,c语言函数参数采用自右向左的入栈顺序,主要原因是为了支持可变长参数形式。换句话说,如果不支持这个特色,c语言完全和pascal一样,采用自左向右的参数入栈方式

⑷ C语言在A函数内部定义动态指针,如何通过形参实参传递到B函数进行分配

你要修改a,就要传递a的地址给allocate, 如下

voidmain()
{
voidallocate(int**a);//函数参数是指向指针的指针

int*a;
allocate(&a);//传递a的地址

free(a);
}
voidallocate(int**a)
{
*a=(int*)malloc(2*sizeof(int));//*a=.....

}

⑸ C语言二维动态数组作为函数形参问题

调用sum(a,x,m,i)的时候,x还没初始化赋值呢,当然不对了


另外前边的m和n都减一是怎么考虑的,减了一后边用到了m和n,malloc(sizeof(int*)*m)申请的内存还符合m行n列的要求么?

……
m=m-1;
n=n-1;//输出数组行数与列数

a=(float**)malloc(sizeof(int*)*m);
……
*(a+i)=(float*)malloc(sizeof(int)*n);
……
r=(float*)malloc(sizeof(int)*m);
d=(float*)malloc(sizeof(int)*m);
x=(float*)malloc(sizeof(int)*m);
……

⑹ C语言中指针参数申请动态内存

voidGetMemory2(char**p,intnum)
{
*p=(char*)malloc(sizeof(char)*num);//这里动态分配内存。返回char*类型
}//分配num个字节的内存

voidTest2(void)
{
char*str=NULL;//定义一个字符串指针赋值为空
GetMemory2(&str,100);//调用GetMemory2函数传的事str这个指针的//地址所以上面那个函数的参数是指针的指针
strcpy(str,"hello");//字符串拷贝
cout<<str<<endl;//输出str指向的字符串不过是C语言为什么用//C++的输出呢?
free(str);释放分配的内存
}



我也是C语言新手,解释得不是很到位。大神勿喷。有错误谢谢指正。好吧?

⑺ C语言中的动态内存分配的用法举例

1、malloc函数:其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。

2、free函数:由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。

3、calloc函数:其作用是在内存的动态存储区中分配n个长度为 size 的连续空间。函数返回一个指向分配区域的起始位置的指针;如果分配不成功,则返回NULL。

(7)c语言动态参数扩展阅读:

函数运算符:

new

运算符new用于向系统申请动态存储空间,并把首地址作为运算结果,它的使用形式为:

指针变量=new 数据类型;

例如:

int *p=new int

该语句的作用是会用new从内存中申请了一个int型变量(4个字节),并将该变量的首地址赋给指针变量p。

new所建立的变量的初始值是任意的,也可在用new分配内存的同时进行初始化。使用形式为:

指针变量=new 数据类型(初始值)。

delete

堆内存可按照要求进行分配,程序对内存的需求量随时会发生变化,有时程序在运行种可能会不再需要由new分配的内存空间,而且程序还未运行结束,这时就需要把先前占用的内存空间释放给堆内存,以后重新分配,供程序的其他部分使用。运算符delete用于释放new分配的内存空间,删除建立的对象,它的使用形式为:

delete指针变量;

其中的指针变量中保存着new分配的内存的首地址。

⑻ C语言 动态二维数组作为参数的问题

楼上的回答应该还是同样问题 编译不过吧?

其实你完全可以这样定义a

a(int n, int m, long **hpos);

这样就解决啦

⑼ c语言参数类型

一般C语言不支持返回字符串,如果一定要这样的话,用动态分配
char *fun()
{
char *p = (char*)malloc(255);
/*给字符串p赋值的内容写在这*/
return p;
}
然后还要有一个对应函数负责释放空间
void unfun(char *p)
{
free(p);
}

main()
{
char *p = fun();
/* ... */
unfun(p);
return 0;
}

⑽ c语言中什么是参数

如何写可变参数的C函数以及这些可变参数的函数编译器是如何实现的呢?下面是我为大家整理的关于c语言的参数介绍及使用,希望可以帮到大家哦。

简单的可变参数的C函数

下面我们来探讨如何写一个简单的可变参数的C函数.写可变参数的C函数要在程序中用到以下这些宏:

void va_start( va_list arg_ptr, prev_param );

type va_arg( va_list arg_ptr, type );

void va_end( va_list arg_ptr );

va在这里是variable-argument(可变参数)的意思.

这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件.下面我们写一个简单的可变参数的函数,改函数至少有一个整数参数,第二个参数也是整数,是可选的.函数只是打印这两个参数的值.

void simple_va_fun(int i, ...)

{

va_list arg_ptr;

int j=0;

va_start(arg_ptr, i);

j=va_arg(arg_ptr, int);

va_end(arg_ptr);

printf(%d %dn, i, j);

return;

}

我们可以在我们的头文件中这样声明我们的函数:

extern void simple_va_fun(int i, ...);

我们在程序中可以这样调用:

simple_va_fun(100);

simple_va_fun(100,200);

从这个函数的实现可以看到,我们使用可变参数应该有以下步骤:

1)首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变量是指向参数的指针.

2)然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数.

3)然后用va_arg返回可变的参数,并赋值给整数j. va_arg的第二个参数是你要返回的参数的类型,这里是int型.

4)最后用va_end宏结束可变参数的获取.然后你就可以在函数里使用第二个参数了.如果函数有多个可变参数的,依次调用va_arg获取各个参数.

如果我们用下面三种 方法 调用的话,都是合法的,但结果却不一样:

1)simple_va_fun(100);

结果是:100 -123456789(会变的值)

2)simple_va_fun(100,200);

结果是:100 200

3)simple_va_fun(100,200,300);

结果是:100 200

我们看到第一种调用有错误,第二种调用正确,第三种调用尽管结果正确,但和我们函数最初的设计有冲突.下面一节我们探讨出现这些结果的原因和可变参数在编译器中是如何处理的.

可变参数在编译器中的处理

我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的,由于1)硬件平台的不同 2)编译器的不同,所以定义的宏也有所不同,下

面以VC++中stdarg.h里x86平台的宏定义摘录如下(''号表示折行):

typedef char * va_list;

#define _INTSIZEOF(n)

((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )

#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )

#define va_arg(ap,t)

( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

热点内容
加减乘除java 发布:2024-12-24 20:51:56 浏览:427
linuxusb摄像头 发布:2024-12-24 20:51:39 浏览:878
ftp是怎么安装的 发布:2024-12-24 20:50:35 浏览:699
国际站服务器是什么 发布:2024-12-24 20:49:43 浏览:354
win7访问win10无权限 发布:2024-12-24 20:39:59 浏览:63
微信投诉无法上传照片 发布:2024-12-24 20:39:55 浏览:89
ug编程过切 发布:2024-12-24 20:34:43 浏览:650
非凡任务电影ftp 发布:2024-12-24 20:30:21 浏览:243
ipad设置文件夹密码 发布:2024-12-24 20:07:52 浏览:533
幻塔h201避难所密码锁是多少 发布:2024-12-24 20:01:53 浏览:853