日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言——指针(进阶版)

發布時間:2024/1/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言——指针(进阶版)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。