標籤:
1、指標與數組
1)指標與一維數組
i.數組指標(指向數組元素的指標)
類型 *指標變數名;
指標定義完成後要初始化(不想讓指向任何內容,=0,=NULL)
int a[10];
int *p = &a[0]; // &a[0] == a
int *p1 = a;
ii.用數組的指標訪問數組元素
位移:指標變數的位移
p1 = p1+1; //向下位移1個一個數組元素
p1++; //p1中存放的還是地址
....
如果用指標訪問第i個元素 p1+i
取出pi指向的元素的值:*(p1+i); == a[i]元素的值
具體地址值計算:p1+sizeof(數組的類型)
指標數組(數組中的每個元素都是指標)
數組中的每一個元素還是一個指標
int a[3][3]={11,2,3,4,5,6,7,8,9};
a[0] //行地址
a[1]
a[2]
//pa就是一個指標數組
int *pa[3]={a[0],a[1],a[2]};
2)指標與二維數組
數組指標(指向數組元素的指標)
特定的格式:
int (*p3)[3]; //定義一個指向二維數組的指標,而且二維數組的第二維長度要是3
int b[3][3];
p3 = b;
int b1[2][3];
p3 = b1;
int b2[2][2];
p3 = b2; //編譯器給警告
用指標對二維數組的遍曆
int a[3][3] ={1,3,3,2,3,4,5,6,6};
int (*p1)[3] = a;
0 1 2
a[0]+0 a[0]+1 a[0]+2
a[0] 1 3 3
a[1] 2 3 4
a[2] 5 6 6
一維數組中: *(p1+0) = a[0]的值
*(a[0]+1)
*(*(p1+0)+1) == a[0][0] 元素的值
求a[i][j] = *(*(p1+i)+j)
指標數組(數組中的每個元素都是指標)
char *name[3][5]={"aaa","bbbb","cccc"};
2、字元數組與字串指標
char 數組名[10];
c語言中沒有字串變數,字串都是通過數組來儲存的
char a[10]="xxxx"; //數組長度10,字串的長度5(sizeof),strlen值4
//字串指標
char *str ="azaaa";
字元數組和字串指標的區別
1)字元數組,由數組元素組成,char c[5];c[5]=‘b‘; 存到棧區
2)字串指標他只存放了字串的首地址,存放到常量區
3)字串指標來說
char *s;
s = "hello";
char ch[5];
ch[5]="aa"; //錯誤的
3、補加的輸入輸出函數
scanf gets(不安全的) puts
fgets(指標,n,stdin); //安全的,
//從鍵盤接收字串,放到指標指向的地址,如果字串長度大於了n,這個時候只接收的字串長度是:n-1,最後一個自動化佈建為‘\0‘
fputs(指標,stdout);
//輸出現實
4、const修飾變數和指標
int const *p //值不能變,指向可變
const int *p //同上
int * const p;//指向不可變,值可變
const int * const p; //值和指向都不能變
5、動態記憶體分配
記憶體的分區:
代碼區 編譯產生的二進位代碼
資料區 程式需要交換的資料
常量區 常量 字串常量
堆區 程式啟動並執行過程中動態申請的記憶體
棧區 局部變數儲存
動態記憶體申請:
程式啟動並執行過程中向堆區動態申請一塊記憶體地區
void* malloc(n) //從記憶體的堆區中申請n個位元組記憶體
void* null 指標類型
儲存整數
//申請了一個4個位元組長度的記憶體地區,首地址放到了p中
int *p =(int *)malloc(4);
char *p1 =(char *)malloc(4);
float *p2 = (float *)malloc(4);
向記憶體單元中儲存內容:
*p = 10;
C語言中的指標與數組