C语言基础知识(40)

如何确定分配的内存部分的大小

在 C 语言中,可以使用 sizeof 运算符计算静态数组的大小,但没有运算符来计算动态分配的内存大小。主要有两种方法可以在代码的每个部分中获取分配的内存大小。

  • 创建一个全局变量来存储分配的内存大小。

  • 携带已分配内存的长度。

示例:

假设需要创建一个大小为 n 的整数数组。 所以要携带数组的数组长度,需要为n+1分配内存。

int*piArray =malloc(sizeof(int)*(n+1));C

如果内存分配成功,则分配 n(数组的大小)它的 0 个位置。

piArray[0]= n;// 或者* piArray = n;C

创建原始指针的副本,但要从一开始就离开一个位置。

int* pTmpArray = piArray +1;C

只要在程序中需要数组的大小,就可以从复制指针中获取。

ArraySize = pTmpArray[-1];C

使用分配的内存后不要忘记释放分配的内存。

free(piArray);

函数的返回值

希望通过函数调用使主调函数得到一个确定的值。

(1)函数的返回值是通过函数中的return语句获取的。

(2)函数值的类型;

(3)如果函数值的类型和return语句中表达式的值不一样,则以函数类型为准。

(4)如果调用函数中没有return语句,并不带回一个确定的用户需要的值,函数不是不带回值,而只是不带回有用的值,带回一个不确定的值。

(5)如不需要带回任何值,用void。

变量存储类别

mtianyan: C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式。

静态存储方式:是指在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量。

动态存储方式:是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。

C语言中存储类别又分为四类:

自动(auto)、

静态(static)、

寄存器的(register)

外部的(extern)。

以下C语言代码的输出是什么

#include#include#define ALLOC_MEMORY 5intmain(){int loop =0;int*ptr =malloc(ALLOC_MEMORY *sizeof(int));if(ptr ==NULL){perror("fail to allocate memory");return-1;}for(loop=0; loop < ALLOC_MEMORY;++loop){*(ptr + loop)= loop;}printf(" %d",*ptr++);printf(" %d",(*ptr)++);printf(" %d",*ptr);printf(" %d",*++ptr);printf(" %d",++*ptr);free(ptr);return0;}

上面示例代码输出结果是:0 1 2 2 3

解释:

第一个 printf:*ptr++ 意味着它将增加地址并取消引用该地址,但这里的增量是一个后增量,所以首先和之后取消引用,所以在基地址上你得到 0(ptr 指向下一个位置)。

第二个 printf: (*ptr)++ 第一次取消引用,然后增加值,所以位置值是 1 是增量,所以得到 2(这里的指针没有改变)。

第三个 printf: *ptr 表示当指针指向该位置时取消引用,所以得到 2。

第五个 printf:*++ptr 表示第一个指针在取消引用后递增,因此得到 2(指针已更改)。

第六个 printf: ++*ptr 表示第一次取消引用,然后增加值,所以得到 3

内部函数与外部函数

在C语言中不能被其他源文件调用的函数称谓内部函数 ,内部函数由static关键字来定义,因此又被称谓静态函数,形式为:

static [数据类型] 函数名([参数])

这里的static是对函数的作用范围的一个限定,限定该函数只能在其所处的源文件中使用,因此在不同文件中出现相同的函数名称的内部函数是没有问题的。

在C语言中能被其他源文件调用的函数称谓外部函数 ,外部函数由extern关键字来定义,形式为:

extern [数据类型] 函数名([参数])

C语言规定,在没有指定函数的作用范围时,系统会默认认为是外部函数,因此当需要定义外部函数时extern也可以省略。

静态变量只赋值一次

你可能感兴趣的:(c语言)