c语言 数组的定义 加上static 和不加 有什么区别呢? C语言编译数组中有的加code有的不加,有什么区别

c\u8bed\u8a00\u4e2d\u5b9a\u4e49\u6570\u7ec4\u957f\u5ea6\u4e0e\u4e0d\u5b9a\u4e49\u6570\u7ec4\u957f\u5ea6\u6709\u4ec0\u4e48\u533a\u522b

C\u8bed\u8a00\u662f\u4f4e\u7ea7\u7684\u9ad8\u7ea7\u8bed\u8a00\uff0c\u4e0d\u4f1a\u63d0\u793a\u8d8a\u754c\uff0c\u4f60\u53ef\u4ee5\u5728\u5b9a\u4e495\u4e2a\u957f\u5ea6\u5443\u5b57\u7b26\u6570\u7ec4\u91cc\u9762\u8f93\u51657\u4e2a\u5b57\u7b26\uff0c\u4f46\u662f\u5b9a\u4e49\u957f\u5ea6\u5e76\u4e0d\u662f\u6ca1\u7528\u7684\uff0c\u7f16\u8bd1\u5668\u4f1a\u4e13\u95e8\u5f00\u8f9f5\u4e2a\u5b57\u7b26\u957f\u5ea6\u7559\u7ed9\u8fd9\u4e2a\u6570\u7ec4\uff0c\u662f\u4e13\u7528\u7684\uff0c\u56e0\u6b64\u4f60\u8f93\u51657\u4e2a\u5b57\u7b26\u540e\uff0c\u540e\u4e24\u4e2a\u5b57\u7b26\u5176\u5b9e\u662f\u8d85\u6807\u9886\u517b\uff0c\u7528\u4e86\u522b\u4eba\u5bb6\u7684\u8d44\u6e90(\u53ef\u80fd\u5360\u7528\u4e86\u5176\u4ed6\u53d8\u91cf\u7684\u7a7a\u95f4)\uff0c\u5e76\u4e14\u5f88\u5bb9\u6613\u5c31\u6ca1\u5a18\u8981\u4e86(\u5bb9\u6613\u51fa\u9519)\u3002\u5982\u679c\u7a0b\u5e8f\u7b80\u5355\uff0c\u6216\u8bb8\u51fa\u9519\u7684\u51e0\u7387\u6bd4\u8f83\u5c0f\uff0c\u4f8b\u5982\u4f60\u53ea\u5b9a\u4e49\u4e86\u8fd9\u4e2a\u6570\u7ec4\u7684\u8bdd\uff0c\u4e5f\u4e0d\u4f1a\u6709\u522b\u7684\u4e1c\u897f\u6765\u5e72\u6270\u4ed6\uff0c\u4ed6\u4e5f\u4e0d\u4f1a\u5e72\u6270\u522b\u7684\u4e1c\u897f\uff0c\u4f46\u662f\u7a0b\u5e8f\u4e00\u65e6\u590d\u6742\u8d77\u6765\uff0c\u5185\u5b58\u7a7a\u95f4\u6bd4\u8f83\u62e5\u6324\uff0c\u90a3\u4e48\u51fa\u9519\u662f\u96be\u514d\u7684\u3002\u56e0\u6b64\u6709\u65f6\u6211\u4eec\u8981\u81ea\u5df1\u53bb\u5b9e\u73b0\u8d8a\u754c\u63d0\u793a\u8fd9\u4e2a\u529f\u80fd\uff0c\u4f46\u662f\u663e\u7136\u8fd9\u6837\u4f1a\u964d\u4f4e\u7a0b\u5e8f\u7684\u6548\u7387\u3002\u4e00\u697c\u7684\u7b54\u6848\u4e5f\u503c\u5f97\u53c2\u8003\uff0c\u4ed6\u8bf4\u7684\u6211\u5c31\u4e0d\u8bf4\u4e86\u3002

\u4f60\u8fd9\u662f\u5355\u7247\u673a\u7684\u7a0b\u5e8f\u5417\uff1f
\u52a0\u4e86code\uff0c\u8fd9\u4e2a\u53d8\u91cf\u4f1a\u5b58\u50a8\u5728rom\u4e2d\uff0c\u4e0d\u80fd\u518d\u6539\u53d8\u3002

c语言中static关键字有两个作用,一是文件作用域,二是函数作用域。

一、文件作用域

文件作用域关键字static的作用是,以static申明的全局变量、函数不得被其他文件所引用,例如:

//这是mystr.c文件的内容
#include <string.h>

static int num = 10;

int mynum = 100;

static int str_len(char *str)
{
return strlen(str);
}

int mystr_len(char *str)
{
return str_len(str) + num;
}

当你mystr.c文件中的str_len函数加上了static关键字,你便不能在其他的地方复用这个函数,譬如,你不能这样写:

//这是main.c 的内容

#include <stdio.h>

int main()
{
int len;
len = str_len("hello, world\n");
printf("%d %d\n", num, len )
return 0;
}

gcc main.c mystr_len.c

将不能编译通过,因为mystr.c中的num变量和str_len函数都用了static关键字,导致他们只能在mystr.c中被使用,如文件中的mystr_len函数可以引用num变量和str_len函数。

//这是main.c 的内容

#include <stdio.h>

int main()
{
int len;
len = mystr_len("hello, world\n");
printf("%d %d\n", my_num, len )
return 0;
}

当不用static关键字时,等同于extern,即
int mystr_len(char *str)
{
return str_len(str) + num;
}



extern int mystr_len(char *str)
{
return str_len(str) + num;
}

是一样的。

二、函数作用域

static另外一个用途是函数内部静态变量,最常用的情况是

int *test()
{
int num = 100;
int *ptr = #
return ptr;
}

int main()
{
printf("%d\n", *test);
return 0;
}

该函数返回整数num的指针,在main函数中打印*test将会出现段错误,因为num做为test函数内部,只能在test内部被访问。以下程序是正确的。

int *test()
{
static int num = 100;
int *ptr = #
return ptr;
}

int main()
{
printf("%d\n", *test);
return 0;
}

该程序中num变量加了关键字static,函数运行结束后,依然可以在其他地方被引用,只是不能直接通过变量名访问,而要间接通过指针访问,原因是 static变量存储在全局数据段中而不是函数栈中。读者可以将它看作特殊的全局变量,只是其他地方只能通过指针来访问,而不能直接通过变量名访问。

扩展阅读:定义数组的三种写法 ... c语言数组的使用例子 ... c语言数组的使用教程 ... c语言数组的3种赋值方法 ... 中英文自动翻译器 ... c数组定义的三种方式 ... c语言数组的使用格式 ... c++编程 ... c语言数组定义的几种方式 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网