1. c语言中怎么把一维数组初始化都为0,
1、首先,需要定义数组,数组常用类型有int型,float浮点型,char字符型等,输入即可定义。
2. 请问C语言中,如何在结构体内定义长度不确定的数组呢
两种方法:
一种是采用指针, 动态分配内存
另一种请搜索"柔性数组", 这种方式同样需要在堆中动态分配内存.
3. C 语言中的柔性数组可以在 C++ 中使用吗
可以使用.
而且,所有的C++编译器都支持柔性数组.
反而是C语言, 有些老的编译器反而不支持柔性数组的.
4. C语言中 指针 数组 结构体 队列 堆栈 变量 区别
指针就是指地址;数组的地址在定义变量时就已经给定了,不能再变化,其大小也是定了的,数组可以通过下表访问,这是数组的方便之处,但是,数组可能存在越界访问和浪费空间的问题;结构体就是将以个项目的所有的属性放在一起,这样方便操作;队列有先进先出的原则;堆栈是存储空间的概念,C语言中的局部变量就是保存在栈空间里的,而用malloc分配的空间是在堆里开辟的;变量的概念就太广了,可以有多种类型的变量。
5. C语言问题啊啊啊
int a[-10]和int[2.5]不合法,因为数组下标不能为负数和浮点数,int a[0]、int a[2*5]和int a[6/2]均为合法,因为数组下标只能为0和正整数
6. 几年前的c语言跟现在有什么不同吗
C语言标准主要有以下几个:C89就是C语言之父编写的经典的《The C Programming Language》使用的C语言标准,C99和最近发布的C2011
C89和C99标准比较
原文转载自: http://blog.programfan.com/article.asp?id=14051
注: GCC支持C99, 通过 --std=c99 命令行参数开启,如:
代码:
gcc --std=c99 test.c
--------------------------------------------------------------------------------------------------
1、增加restrict指针
C99中增加了公适用于指针的restrict类型修饰符,它是初始访问指针所指对象的惟一途径,因此只
有借助restrict指针表达式才能访问对象。restrict指针指针主要用做函数变元,或者指向由malloc()函
数所分配的内存变量。restrict数据类型不改变程序的语义。
如果某个函数定义了两个restrict指针变元,编译程序就假定它们指向两个不同的对象,memcpy()
函数就是restrict指针的一个典型应用示例。C89中memcpy()函数原型如下:
代码:
void *memcpy (void *s1, const void *s2, size_t size);如果s1和s2所指向的对象重叠,
其操作就是未定义的。memcpy()函数只能用于不重叠的对象。C99中memcpy()函数原型如下:
代码:
void *memcpy(void *restrict s1, const void *restrict s2,size_t size);通过使用restrict
修饰s1和s2 变元,可确保它们在该原型中指向不同的对象。
2、inline(内联)关键字
内联函数除了保持结构化和函数式的定义方式外,还能使程序员写出高效率的代码.函数的每次调用与
返回都会消耗相当大的系统资源,尤其是当函数调用发生在重复次数很多的循环语句中时.一般情况下,当发
生一次函数调用时,变元需要进栈,各种寄存器内存需要保存.当函数返回时,寄存器的内容需要恢复。如果该
函数在代码内进行联机扩展,当代码执行时,这些保存和恢复操作旅游活动会再发生,而且函数调用的执
行速度也会大大加快。函数的联机扩展会产生较长的代码,所以只应该内联对应用程序性能有显着影响的
函数以及长度较短的函数。
3、新增数据类型
_Bool
值是0或1。C99中增加了用来定义bool、true以及false宏的头文件夹<stdbool.h>,以便程序
员能够编写同时兼容于C与C++的应用程序。在编写新的应用程序时,应该使用
<stdbool.h>头文件中的bool宏。
_Complex and _Imaginary
C99标准中定义的复数类型如下:float_Complex; float_Imaginary; double_Complex;
double_Imaginary; long double_Complex; long double_Imaginary.
<complex.h>头文件中定义了complex和imaginary宏,并将它们扩展为_Complex和_Imaginary,
因此在编写新的应用程序时,应该使用<stdbool.h>头文件中的complex和imaginary宏。
long long int
C99标准中引进了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64
- 1)。long long int能够支持的整数长度为64位。
4、对数组的增强
可变长数组
C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定
其值的表达式,这类数组就叫做可变长数组,但是只有局部数组才可以是变长的.
可变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的.可以变化的只是数组的大小.
可以使用*来定义不确定长的可变长数组。
数组声明中的类型修饰符
在C99中,如果需要使用数组作为函数变元,可以在数组声明的方括号内使用static关键字,这相
当于告诉编译程序,变元所指向的数组将至少包含指定的元素个数。也可以在数组声明的方括号内使用
restrict,volatile,const关键字,但只用于函数变元。如果使用restrict,指针是初始访问该对象的惟一途
径。如果使用const,指针始终指向同一个数组。使用volatile没有任何意义。
5、单行注释
引入了单行注释标记 "//" , 可以象C++一样使用这种注释了。
6、分散代码与声明
7、预处理程序的修改
a、变元列表
宏可以带变元,在宏定义中用省略号(...)表示。内部预处理标识符__VA_ARGS__决定变元将在何
处得到替换。例:#define MySum(...) sum(__VA_ARGS__) 语句MySum(k,m,n);
将被转换成:sum(k, m, n);变元还可以包含变元。例: #define compare(compf, ...)
compf(__VA_ARGS__) 其中的compare(strcmp,"small", "large"); 将替换成:
strcmp("small","large");
b、_Pragma运算符
C99引入了在程序中定义编译指令的另外一种方法:_Pragma运算符。格式如下:
_Pragma("directive")
其中directive是要满打满算的编译指令。_Pragma运算符允许编译指令参与宏替换。
c、内部编译指令
STDCFP_CONTRACT ON/OFF/DEFAULT 若为ON,浮点表达式被当做基于硬件方式处理的独立
单元。默认值是定义的工具。
STDCFEVN_ACCESS ON/OFF/DEFAULT 告诉编译程序可以访问浮点环境。默认值是定义的工具。
STDC CX_LIMITED_RANGE ON/OFF/DEFAULT 若值为ON,相当于告诉编译程序某程序某些含
有复数的公式是可靠的。默认是OFF。
d、新增的内部宏
__STDC_HOSTED__ 若操作系统存在,则为1
__STDC_VERSION__ 199991L或更高。代表C的版本
__STDC_IEC_599__ 若支持IEC 60559浮点运算,则为1
__STDC_IEC_599_COMPLEX__ 若支持IEC 60599复数运算,则为1
__STDC_ISO_10646__ 由编译程序支持,用于说明ISO/IEC 10646标准的年和月格式:
yyymmmL
8、for语句内的变量声明
C99中,程序员可以在for语句的初始化部分定义一个或多个变量,这些变量的作用域仅于本for语
句所控制的循环体内。比如:
代码:
for(int i=0; i<10; i++){
// do someting ...
}
9、复合赋值
C99中,复合赋值中,可以指定对象类型的数组、结构或联合表达式。当使用复合赋值时,应在括号
内指定类型,后跟由花括号围起来的初始化列表;若类型为数组,则不能指定数组的大小。建成的对象是
未命名的。
例: double *fp = (double[]) {1.1, 2.2, 3.3};
该语句用于建立一个指向double的指针fp,且该指针指向这个3元素数组的第一个元素。 在文件
域内建立的复合赋值只在程序的整个生存期内有效。在模块内建立的复合赋值是局部对象,在退出模块后
不再存在。
10、柔性数组结构成员
C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数
组成员前面必须至少一个其他成员。柔性数组成员允许结构中包含一个大小可变的数组。sizeof返回的这
种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且
分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
11、指定的初始化符
C99中,该特性对经常使用稀疏数组的程序员十分有用。指定的初始化符通常有两种用法:用于数组,
以及用于结构和联合。用于数组的格式:[index] = vol; 其中,index表示数组的下标,vol表示本数组
元素的初始化值。
例如: int x[10] = {[0] = 10, [5] = 30}; 其中只有x[0]和x[5]得到了初始化.用于结构或联
合的格式如下:
member-name(成员名称)
对结构进行指定的初始化时,允许采用简单的方法对结构中的指定成员进行初始化。
例如: struct example{ int k, m, n; } object = {m = 10,n = 200};
其中,没有初始化k。对结构成员进行初始化的顺序没有限制。
12、printf()和scanf()函数系列的增强
C99中printf()和scanf()函数系列引进了处理long long int和unsigned long long int数据类型
的特性。long long int 类型的格式修饰符是ll。在printf()和scanf()函数中,ll适用于d, i, o, u 和x
格式说明符。另外,C99还引进了hh修饰符。当使用d, i, o, u和x格式说明符时,hh用于指定char
型变元。ll和hh修饰符均可以用于n说明符。
格式修饰符a和A用在printf()函数中时,结果将会输出十六进制的浮点数。格式如下:[-]0xh, hhhhp
+ d 使用A格式修饰符时,x和p必须是大写。A和a格式修饰符也可以用在scanf()函数中,用于读取
浮点数。调用printf()函数时,允许在%f说明符前加上l修饰符,即%lf,但不起作用。
13、C99新增的库
C89中标准的头文件
<assert.h> 定义宏assert()
<ctype.h> 字符处理
<errno.h> 错误报告
<float.h> 定义与实现相关的浮点值勤
<limits.h> 定义与实现相关的各种极限值
<locale.h> 支持函数setlocale()
<math.h> 数学函数库使用的各种定义
<setjmp.h> 支持非局部跳转
<signal.h> 定义信号值
<stdarg.h> 支持可变长度的变元列表
<stddef.h> 定义常用常数
<stdio.h> 支持文件输入和输出
<stdlib.h> 其他各种声明
<string.h> 支持串函数
<time.h> 支持系统时间函数
C99新增的头文件和库
<complex.h> 支持复数算法
<fenv.h> 给出对浮点状态标记和浮点环境的其他方面的访问
<inttypes.h> 定义标准的、可移植的整型类型集合。也支持处理最大宽度整数的函数
<iso646.h> 首先在此1995年第一次修订时引进,用于定义对应各种运算符的宏
<stdbool.h> 支持布尔数据类型类型。定义宏bool,以便兼容于C++
<stdint.h> 定义标准的、可移植的整型类型集合。该文件包含在<inttypes.h>中
<tgmath.h> 定义一般类型的浮点宏
<wchar.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节函数
<wctype.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节分类函数
14、__func__预定义标识符
用于指出__func__所存放的函数名,类似于字符串赋值。
15、其它特性的改动
放宽的转换限制
限制C89标准C99标准
数据块的嵌套层数15127
条件语句的嵌套层数8 63
内部标识符中的有效字符个数3163
外部标识符中的有效字符个数631
结构或联合中的成员个数1271023
函数调用中的参数个数31127
不再支持隐含式的int规则
删除了隐含式函数声明
对返回值的约束
C99中,非空类型函数必须使用带返回值的return语句.
扩展的整数类型
扩展类型 含义
int16_t 整数长度为精确16位
int_least16_t 整数长度为至少16位
int_fast32_t 最稳固的整数类型,其长度为至少32位
intmax_t 最大整数类型
uintmax_t 最大无符号整数类型
对整数类型提升规则的改进
C89中,表达式中类型为char,short int或int的值可以提升为int或unsigned int类型.
C99中,每种整数类型都有一个级别.例如:long long int 的级别高于int, int的级别高于char
等.在表达式中,其级别低于int或unsigned int的任何整数类型均可被替换成int或unsigned int类型.
c语言最新标准C11
主要的改变包括:
— conditional (optional) features (including some that were previously mandatory)
— support for multiple threads of execution including an improved memory sequencing
model, atomic objects, and thread-local storage (<stdatomic.h> and
<threads.h>)
多线程相关
— additional floating-point characteristic macros (<float.h>)
— querying and specifying alignment of objects (<stdalign.h>, <stdlib.h>)
— Unicode characters and strings(<uchar.h>)
(originally specified in ISO/IEC TR 19769:2004)
UNICODE支持
— type-generic expressions
Type-generic expressions using the _Generic keyword. For example, the following macro cbrt(x) translates to cbrtl(x), cbrt(x) or cbrtf(x)
depending on the type of x:
#define cbrt(X) _Generic((X), long double: cbrtl, \
default: cbrt, \
float: cbrtf)(X)这个特性应该是对泛型编程的支持(越来越与C++亲近)
— static assertions
静态断言(C++ BOOST库中有相关的库)
— anonymous structures and unions
— no-return functions
— macros to create complex numbers (<complex.h>)
— support for opening files for exclusive access
打开文件的独占式访问
— removed the gets function (<stdio.h>)
去掉了gets函数(大家还记得gcc的wangning吗)
— added the aligned_alloc, at_quick_exit, and quick_exit functions (<stdlib.h>)
— (conditional) support for bounds-checking interfaces (originally specified in
ISO/IEC TR 24731−1:2007)
— (conditional) support for analyzability
----Alignment specification (_Alignas specifier, alignof operator, aligned_alloc function, <stdalign.h> header file)
7. c语言动态数组 我想想创建一个数组a,不知道有几个数,可能很多有100~1000左右吧!
1.用链表
2.用柔性数组(参考:http://blog.csdn.net/ke56/article/details/7307203)
3.柔性数组+链表
===================================
1.链表虽好实现比较灵活,但太占内存了,在动态申请时指针也要占用一个空间,如果是一个一个不是连续的,这样就得一直建链表,很费内存
2.相对链表不是很灵活,但占用内存只是你所要的数据+sizeof(int)
3.两者相结合使用,柔性数组成员不够用了,可再申请内存,用链表连接(建议用这种方法)
8. 关于C语言中柔性数组内存释放问题
首先,结构体里char * cpArr[0];的意思是分配0个为char *元素的数组,其实就是不分配,所以sizeof (struct testStruct)的值是4
然后,sizeof (struct testStruct) + 3 * sizeof (char *)表示的其实就是4个char*指针所占用的内存空间,也就是4个struct testStruct结构体所占用的内存空间。
这样看来,指针t应该指向的是一个有4个struct testStruct元素的结构体,理论上应该不会导致内存泄漏。
这段代码的大概目的就是打算让struct testStruct结构体的cpArr数组可以有多个,且个数不确定的元素。虽然编译器没有给出警告,但这样的代码是一个很不好的代码——不但降低了可读性,也降低了可靠性。如果你想建立一个struct testStruct结构体的数组,如果直接使用struct testStruct * t = (struct testStruct *) malloc (2*(sizeof (struct testStruct) + 3 * sizeof (char *)));分配内存,那么t[1]->cpArr[0]和t[0]->cpArr[1]将代表同一个值。
建议使用
struct testStruct * t = (struct testStruct *) malloc (sizeof (struct testStruct));
t->cpArr=(char**)malloc(3*sizeof(char*));
来分配内存,使用
free (t->cpArr);
free (t);
来释放内存,char**的意思就是指向char*的指针,为了建立一个char*指针的数组,即字符串数组。而使用时还可以使用t->cpArr[0]、t->cpArr[1]、t->cpArr[2]来表示。即这个程序的代码可以改成
#include<stdio.h>
#include<stdlib.h>
struct testStruct
{
char * c;
char ** cpArr;
};
int main (void)
{
struct testStruct * t = (struct testStruct *) malloc (sizeof (struct testStruct));
t->cpArr=(char**)malloc(3*sizeof(char*));
t->cpArr[0] = "This";
t->cpArr[1] = "is a";
t->cpArr[2] = "test.";
printf ("%s %s %s\n", t->cpArr[0], t->cpArr[1], t->cpArr[2]);
free (t->cpArr);
free (t);
return 0;
}
这样虽然多占了一个char**指针的空间,但会大大增强程序的可读性和可靠性,就不会有问题了。
9. c语言的精通
基本上 谭的书里面已经介绍了大多数C的用法
没介绍到的 用的不是太广泛
所以 没什么必要去深究 甚至专门学的
以后有机会用到了 随便看看就会了
就像柔性数组 其实只是一种使用技巧,以C语言语法为基础 通过特殊的方式 改变数组大小而已
甚至有些编译器都不支持这种用法的。
还是学数据结构用处更大。