C语言——指针(进阶版)
????????????????????????目錄
?
????????????????指針的進階
????????????????1.字符指針
?????????????????2.指針數組
?????????????????3.數組指針
????????3.1 數組指針的定義
?????????3.2數組指針的使用
4.動態內存分配與指向它的指針變量
4.1 什么是內存的動態分配
?4.2怎樣建立內存的動態分配
1.用malloc函數開辟動態存儲區
2.用calloc 函數開辟動態存儲區
?3.用realloc函數重新分配動態存儲區
?4.用free函數釋放動態存儲區
指針的進階
本章重點
回顧上一篇博客 c語言——指針 我們已經先了解了指針的基本概念:
1.指針就是個變量,用來存放地址,地址唯一標識一塊內存空間;
2.指針的大小是固定的4/8字(32位平臺/64的平臺)。
3.指針是有類型丶指針的類型決定了指針的+-整數的步長,指針解引用操作的時候的權限
4.指針的運算。
1.字符指針
在指針的類型中我們知道有一種指針類型為字符 char*;
一般使用:
int main(){char ch = 'w';char *pc =&ch;*pc='w';return 0;}還有一種方法如下:
int main(){ const char *p = "hello bit." //這里是把一個一個字符串放到p指針變量里面嗎?? printf("%s\n",p); return 0; }代碼 const char *p="hello bit."
特別讓大家誤認為是字符串 hello bit.放到字符指針p里了,但是本質是把字符串hello bit
首字符的地址放到了p中。
?2.指針數組
在《指針》章節我們也學了指針數組,指針數組是一個存放指針的數組
下面的指針數組是什么意思?
int *arr1[10]; //整型指針的數組 char *arr2[4]; //一級字符指針的數組 char **arr3[5]; //二級字符指針的數組?3.數組指針
3.1 數組指針的定義
數組指針是指針? 還是數組?
答案 是 :指針
整型指針:int *pint 能夠指向整型數據的指針。
浮點型指針:float *pf;能夠指向浮點型數據的指針。
那數組指針應該是:能夠指向數組的指針。
下面代碼哪個是數組指針?
int *p1[10]; int (*p2)[10]; //p1,p2分別是什么?解釋
int (*p)[10];//解釋:p先和*結合,說明p是一個指針變量,然后指著指向的是一個大小為10個整型的數組。 所以p是一個指針,叫數組指針。//這里要注意:[]的優先級要高于*號的,所以必須加上()來確保p先和*結合。?3.2數組指針的使用
那數組指針是怎么使用的呢?
既然數組指針指向的是數組,那數組指針中存放的應該是數組的地址。
來看一段代碼!
#include<stdio> int main(){ int arr[10]={1,2,3,4,5,6,7,8,9,0}; int (*p)[10];=&arr;//把數組arr的地址賦給數組指針變量p //但是我們基本上不用這種代碼 return 0;}一個數組指針的使用↓
#include<stdio.h> void print_arr(int arr[3][5],int row,int col{ int i = 0; for(i=0;i<row;i++){ int j = 0; for(j=0;j<col;j++){ printf("%d",arr[i][j]);} printf("%\n"); } } void print_arr1(int (*arr)[5],int row,int col){ int i = 0; for(i=0;i<row;i++){ int j = 0; for(j=0;j<col;j++) { printf("%d",arr[i][j]); } printf("%\n"); }} int main(){ int arr[3][5]={1,2,3,4,5,6,7,8,9,,10}; print_arr(arr,3,5); //數組名arr,表示首元素的地址 print_arr1(arr,3,5);//但是二維數組的首元素是二維數組的第一行 return 0; //所以這里傳遞的arr,其實相當于第一行的地址,是一維數組的地址//可以數組指針來接受 }4.動態內存分配與指向它的指針變量
4.1 什么是內存的動態分配
全局變量是是分配在內存中的靜態存儲區的非靜態的局部變量(包括形參)是分配在內存中的動態存儲區,這個存儲區是一個稱為棧(stack)的區域。除此之外,C語言還允許建立內存動態分配區域,以存放一些臨時用的數據,這些數據不必在程序的聲明部分定義,也不必等到函數結束時才釋放,而是需要隨時開辟,不需要隨時釋放。這些數據是臨時存放在一個特別的自由存儲區,稱為堆(heap)區。可以根據需要,向系統申請所需的大小的空間。由于未在聲明部分定義它們為變量或數組,因此不能通過變量名或數組名去引用這些數組,只能通過指針來引用。
,
?4.2怎樣建立內存的動態分配
對內存的動態分配是通過系統提供的庫函數來實現的。主要有malloc,calloc,free,realloc 這4個函數。
1.用malloc函數開辟動態存儲區
void *malloc(unsigned int size);
某作用是在內存的動態存儲區中分配 一個長度為size的連續空間。形參size的類型定位無符號整型(不允許為負數)。次函數的值(即“返回值”)是所分配區域的第一個字節的地址,
或者說,此函數是一個指針型函數,返回的指針指向該分配域的第一個字節 如:
malloc(100) :? ? ? ? ? ? ? ? ? ? //開辟100字節的臨時分配域,函數值為其第一個字節的地址
注意指針的基類型為void,即不指向任何類型的數據,只提供一個純地址。如果此函數未能成功地執行(例如內存空間不足),則返回空指針(NULL)。
2.用calloc 函數開辟動態存儲區
其函數原型為
void *calloc(unsigned n.unsigned size);
其作用是在內存的動態存儲區分配n個長度為size的連續空間,這個空間一般比較大,足以保存一個數組。
用calloc函數可以為一維數組數組開辟動態存儲空間,n為數組元素個數,每個元素長度為
size。這就是動態數組。函數返回指向所分配域的第一個字節的指針;如果分配不成功,返回NULL。如:
p=calloc(50,4) //開辟50×4個字節的臨時分配域,把首地址賦給指針變量p
?3.用realloc函數重新分配動態存儲區
其函數原型為 void *realloc(void *p,unsigned int size); 如果已經通過malloc函數或calloc函數獲得了動態空間,想要改變其大小,可以用recalloc函數重新分配。 用realloc 函數將p所指向的動態空間的大小改變為size,p的值不變。如果重分配不成功,返回NULL,如 relloc(p,500);?4.用free函數釋放動態存儲區
其函數原型為
void free(void *p);
其作用是釋放指針變量p所指向的動態空間,使這部分空間能重新被其他變量使用。p應是最近一次調用calloc或malloc函數時得到的函數返回值,如:
free(p);? ? ? ?//釋放指針變量p所指向的已分配的動態空間
free 函數無返回值。
以上4個函數的聲明在stdlib.h頭文件,在用到這些函數時應用“”#include? <stdio.h>"
指令吧stdlib.h頭文件包含到程序文件中
新年第一篇博客 希望友友們可以大力支持?
再次 小王同學祝大家虎年大吉 虎虎生威
祝大家新的一年 多拿offer ,開開心心進大廠!(doge)?
總結
以上是生活随笔為你收集整理的C语言——指针(进阶版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 太乐了 哈哈哈
- 下一篇: 机器学习中的数学——牛顿迭代法(Newt