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