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語言語法為基礎 通過特殊的方式 改變數組大小而已
甚至有些編譯器都不支持這種用法的。
還是學數據結構用處更大。