c语言笔记之数组和指针(初学者)
數組
定義
由數據類型相同的一系列元素組成
size_t arr[index]={ }
*當{}內列出元素的值,可以讓編譯器自己數出數組大小,此時index可省略不寫。數組的長度可以用(sizeof arr)/(sizeof arr[0])間接得出
初始化
不完全初始化時,編譯器會把剩余的未初始化的數組初始化為0.
C99中在大括號內對指定元素賦值可用{[index] = data}的形式表示
未初始化的數組不要隨意使用,內部數據是隨機值。
不能使用變量定義數組(新手極易犯此種錯誤)
ps:C99引入了“變長數組”,可以用變量定義數組,但是聲明時不允許初始化。
用const聲明數組
只讀數組用const聲明,只能檢索不能修改,程序穩定性更高。
數組溢出
對于定義的type arr[index],實際的下標邊界是從0~index-1
多維數組
size_t arr[index1] [index2]={ }
*二維數組的定義和賦值形式如上,不能缺省二維的長度說明
二維數組的遍歷需要雙重循環
用途:char類型的一維數組存放字符串:char a[ ]={‘t’,‘e’,‘x’,‘t’,’\0’}等價于char a[ ]=“text”;,二維數組能夠存放多個字符串,且采用初值表進行初始化時‘\0’必須給出。此時arr[i] [j]表示引用某個字符,而arr[i]表示引用某個字符串
字符串數組
char s[]={‘h’,‘o’,‘y’,’\0’}或者char s[]={“hoy”} 輸出時printf()內用%s的格式
(內部的原理是從首地址逐個取出,直到遇到‘\0’為止)
如果輸出遇不到\0:按照定義變量時的存儲規則(定義的先后存儲時地址從大到小也是從下到上),會打印出相鄰地址的字符。注意:‘\0’對應的ASCII值是‘0’,若數組后位為0也不會錯誤。
數組傳參
將數組傳入目標函數,傳入的是首個元素的地址,無法在內部用sizeof(arr)/sizeof(0)得到數組長度,所以必須要在外部算出數組長度再把長度一起傳入。/將數組傳入函數時,要單獨傳入數組的大小/
一定記住!傳入的是地址 地址 !不是整個數組的值!必須同時傳入長度 長度 長度!
長度要在主函數內算出來k
深入理解數組
在C中數組名表示第0個元素的地址,即對于定義的a[index]數組,a等價于&a[0],實質是一個地址常量,其值不能更改,做比較也無意義。
- 存儲:連續存放
- 數組名:首元素的地址。 *arr——讀取首元素的值
例外!:sizeof()內部單獨放一個數組名,計算的是整個數組占的字節大小。&數組名,取出的是整個數組的地址,雖然和首元素地址相同但是跨度是整個數組!
指針
定義
存放變量的地址。一定要指向一個變量
int *p = &x;
同一個變量可以有多個指針指向它,但一個指針不能同時指向多個變量,指針的指向可以修改
空指針:給指針賦一個NULL值 int *p = NULL; p的地址為0x0
檢查空指針:
*多級指針:int *pp 存放*p的地址
*解引用操作符:通過地址找到對象。對pp的解引用找到的是p, 而*p就訪問到x
指針的運算
指針的遞增遞減:p++ (p–)用指針代替數組,因其自增自減的性質,從而便于順序訪問內存中的每一個元素。注意區分*p++——(++的對象是指針)和§++——(p所指對象++)
數組名稱不能做加減運算操作,只有指針才可以;指針的加減按照單元(根據類型分配字節數)。
指針的比較:地址的比較,可以用作遍歷數組的循環條件等。
應用場景
1、函數需要返回多個值,即需要保存多個變量的改變量
2、函數返回運算狀態,結果由指針返回
傳入數組就是傳入指針,指針可以當作數組使用,只要傳入大小. *數組是const的指針,即int b [ ] ;等價于int * const b ;
const int p=&i; 表示不能通過p去修改i,但變量仍可被賦值,p也可以指向其他的變量。
在函數中改變數組的元素,main中的數組元素的值也改變。
3、用指針來存放字符串,字符串存儲在常量區,無法對**p[0]**進行修改,
數組保存的字符串以變量形式存儲在棧中
需要使用時即調用,效率高,開辟的存儲空間少。
常用重定義:typedef char * string;
指針數組
實質是數組,存放指針。
int* arr[3] = {&a,&b,&c};
深入理解指針的存儲
指針本身需要計算機用內存存儲。
無論什么類型的指針,占據的內存區大小是相同的
這就是為什么sizeof一個數組時(數組跟指針有互通之處)得出的值恒為8或4了。
函數指針
void ( funcP) ();* 定義
funcP = function; 指向函數,不要寫成function()
(*funcP)(); 等價于 funcP(); 等價于 function(); 使用
總結
以上是生活随笔為你收集整理的c语言笔记之数组和指针(初学者)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贝叶斯软件genle教程_一文读懂蒙特卡
- 下一篇: 软件构造第一篇博客(“可变形与不可变性”