int value[3] = {5};
int *p_value = value; // 普通數組變量聲明方法
int (*p_value1)[3] = &value; // 數組指針聲明方法
數組指針是對數組名稱取地址,和指針數組不一樣;
變量地址可以指這個變量,但是數組名稱地址,不代表這個數組,只是編譯器臨時創建的地址;
對一維數組名取地址得到的地址數據和二維數組名稱代表的地址數據類似;
對他們做加 1 操作時,增加的是整個一維數組的大小;
切記:二維數組名稱和二級指針是不一樣的;
二級指針加 1 ,增加的是一級指針的大小;
聲明方法:int (*p_value)[5];
int main()
{
int value[3] = {5};
int values[3][4] = {0};
printf("%p\n", value); // 數組首變量地址
printf("%p\n", &value); // 數組地址,和value地址在數值上是一樣的
printf("%d\n", *value); // 輸出爲:5,相當於value[0]
printf("%p\n", value + 1); // 加一個變量大小
printf("%p\n", &value + 1); // 加整個數組大小
printf("%p\n", values + 1); // 增加一維數組大小
}
2. 文件處理:FILE結構體,這裏引入的指針概念並非真的指針;
fopen 函數可以打開並連接文件,把結構體變量的地址作爲返回值使用,如果執行失敗則返回 NULL;
使用 fopen 函數,需要指定文件操作方式,由三部分構成,分別如下:
第一部分有三個可選字符 'r','w','a';這部分必須指定一個且只能是一個操作符
'r':對文件進行讀操作;
'w':對文件進行寫操作;如果文件不存在,則創建新文件,否則把原文件內容清除;
'a':對文件進行寫操作;如果文件已存在,則會把新內容追加到文件末尾;
第二部分有一個可選字符 '+',這部分可有可無;如果使用則表示這部分表示可讀可寫;如:'a+'(先寫後讀)
第三部分有一個可選字符 'b',也是可有可無;如果使用則表示對文件以二進制的方式操作;如:' wb'
fclose 函數用於關閉一個文件,當程序不再使用這個文件的時候,一定要記得把文件關閉;
fputc 函數可以把一串字符寫入到文件中去,一次讀一個字符;前一個參數是要寫入的文件內容,後一個參數是文件指針;
如果寫入失敗,則返回 EOF ;EOF在C語言中宏定義爲 -1;
fgetc 函數可以從文件中讀出一個字符並返回,如果超過文件尾部,則返回 EOF;
FILE 結構體中使用位置指針記錄下次對文件進行讀寫操作的位置;每次對文件進行過讀寫操作後,位置指針都會移動。
rewind 函數可以把位置指針移動到開頭;(wenjian4.c)
#include <stdio.h>
int main()
{
FILE *p_file = NULL;
p_file = fopen("a.txt", "w+"); // fopen前一個參數是文件地址,後一個參數是操作方式
if (p_file) // 如果文件打開失敗,即p_file = 0,則不執行下面的操作;
{
// 下面這段代碼實現寫入文件操作
char str[] = "abcd";
int loop = 0;
while (str[loop]) // 如果遇到 /0 則停止循環
{
if (EOF == fputc(str[loop], p_file)) // 把數組內容寫入p_file,也就是a.txt文件裏
break;
loop++;
}
// 下面這段代碼實現讀出文件內容並打印在屏幕上
rewind(p_file); // 把寫完後的指針移到開頭,要不然無法讀出
char ch = 0; // 用於存放文件中讀出的字符
do {
ch = fgetc(p_file); // 讀取字符,並存儲在ch裏,超出文件返回EOF
if (EOF != ch) // 因爲是先do,所以這裏還需要再判斷一次ch是否有字符
printf("%c", ch);
} while (EOF != ch); // 如果 ch 有字符,進入循環
// 下面兩行代碼是讀寫公用的,用於清除並釋放文件
fclose(p_file); // 清除文件,不能用free,free只是清除內存
p_file = NULL; // 這段代碼可以不寫,寫的話只是爲了養成良好編程習慣
}
}
fwrite 函數可以一次把數組中多個變量以二進制方式寫入文件中,返回值表示寫入的變量個數;(wenjian2.c)
共有四個參數:
第一個是源文件,要寫入的內容,一般是數組名
第二個是每個變量大小
第三個是要寫入的變量個數,和 fwrite 的返回值一樣
第四個是輸出文件指針
fread 函數可以以二進制的方式把文件中多個變量一次讀出,記錄在數組中,返回值爲變量個數;(wenjian3.c)
參數同 fwrite
int strs[5] = {2, 5, 4, 6, 4};
FILE *p_file = NULL;
p_file = fopen("a.bin", "w+b"); // 一般以二進制輸入
if (p_file)
{
fwrite(strs, sizeof(int), 4, p_file);
// 下面是讀取
rewind(p_file); // 移動指針,否則無法讀取
fread(strs, sizeof(int), 4, p_file);
int loop = 0;
for (loop = 0; loop < 4; loop++) // 把讀取到的輸出
printf("%d", strs[loop]);
// 共同部分
fclose(p_file);
p_file = NULL;
}
fseek 函數可以把位置指針移到任何地方;(wenjian5.c)
c 語言中有三個宏標誌文件指針位置:
SEEK_SET 0 代表文件開頭 fseek(p_file, 2, SEEK_SET); // 指針放到開頭第二個字符
SEEK_CUR 1 代表位置指針當前位置 fseek(p_file, 1, SEEK_SUR); // 當前指針的下一個指針
SEEK_END 2 代表文件結尾 fseek(p_file, -5, SEED_END); // 因爲是從末尾倒數,所以爲負數
fputs 函數可以把字符串寫到文件中;(不常用)
fgets 函數可以把文件中讀取字符串;
fprintf 函數可以把數據以指定格式寫到任何文件中;
fscanf 函數可以從任何文件中以指定的格式讀入數據變量;
3. 可變長參數,求一組整數中最大值 (canshu.c)
#include <stdarg.h> // 使用可變長參數函數,需要包含這個頭文件
int max(int cnt, ...) // 第一個參數指後面行參個數,後面是省略號
{
int ret = 0; // ret 作爲最後函數的返回值
va_list v; // 用於獲得不確定參數
va_start(v, cnt); // 初始化參數
int loop = 0; // 遍歷用
for (loop = 0; loop < cnt; loop++)
{
int value = va_arg(v, int); // 從變量 v 裏面拿出一個整數
if (value > ret)
ret = value;
}
va_end(v); // 清理變量
return ret;
}
int main()
{
printf("%d\n", max(2, 6, 9)); // max 參數第一個爲變量個數,6 和 9 是參加比較的變量,輸出:9
return 0;
}
4. atoi 函數可以把字符串裏數字轉換爲整數輸出
atof 函數可以把字符串裏數字轉換爲浮點數輸出
sscanf 函數可以一次讀入多個數據,分別輸出
sprintf 函數把多個字符串按指定格式寫入
舉例:(hanshu.c)
#include <stdlib>
int main()
{
int value = atoi("546"); // 輸出:546
int d_value = atof("23.5"); // 輸出:23.5
char ch = 0;
float f_value = 0.0f;
sscanf("25.8 a", "%g %c", &f_value, &ch); // 注意雙引號裏面的空格,且順序要對應
printf("%g %c\n", f_value, ch); // 輸出:25.8 a
char strs[20] = {0};
sprintf(strs, "%c %g", ch, f_value); // 第一個參數爲字符串數組名
printf("%s\n", strs); // 輸出:25.8 a
}