亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言指針的長度和類型深入分析

2020-01-26 15:20:20
字體:
來源:轉載
供稿:網友

指針是C語言的精髓,本文就以實例的形式詳細分析了C語言的長度和類型。對于初學者深入理解C語言程序設計有很好的參考價值。具體分析如下:

一般來說,如果考慮應用程序的兼容性和可移植性,指針的長度就是一個問題,在大部分現代平臺上,數據指針的長度通常是一樣的,與指針類型無關,盡管C標準沒有規定所有類型指針的長度相同,但是通常實際情況就是這樣。但是函數指針長度可能與數據指針的長度不同。

指針的長度取決于使用的機器和編譯器,例如:在現代windows上,指針是32位或是64位長

測試代碼如下:

#include<stdio.h>#include<math.h>#include<stdlib.h>#include<stddef.h>struct p{  int n;  float f;};int main(){  struct p *sptr;  printf("sizeof *char: %d/n", sizeof(char*));  printf("sizeof *int: %d/n", sizeof(int*));  printf("sizeof *float: %d/n", sizeof(float*));  printf("sizeof *double: %d/n", sizeof(double*));  printf("sizeof *struct: %d/n", sizeof(sptr));  return 0;}

運行結果如下圖所示:

指針相關的預定義類型:

① size_t:用于安全地表示長度
② ptrdiff_t:用于處理指針算術運算
③ intptr_t:用于存儲指針地址
④ uintptr_t:用于存儲指針地址

分述如下:

一、size_t類型

size_t 類型是標準C庫中定義的,應為unsigned int,在64位系統中為 long unsigned int。 C語言中,此類型位于頭文件stddef.h中。它是一個與機器相關的unsigned類型,其大小足以保證存儲內存中對象的大小,它的目的是提供一種可移植的方法來聲明與系統中可尋址的內存區域一致的長度:

因為C/C++標準只定義一最低的位數,而不是必需的固定位數。而且在內存里,對數的高位對齊存儲還是低位對齊存儲各系統都不一樣。為了提高代碼的可移植性,就有必要定義這樣的數據類型。一般這種類型都會定義到它具體占幾位內存等。當然,有些是編譯器或系統已經給定義好的。經測試發現,在32位系統中size_t是4字節的,而在64位系統中,size_t是8字節的,這樣利用該類型可以增強程序的可移植性。

size_t類型用作sizeof操作符的返回類型,同時也是很多函數的參數類型,包括malloc和strlen

在聲明例如字符數、或者數組索引這樣的長度變量時用size_t是好的做法,它經常用于循環計數器、數組索引,有時候還用在指針算術運算上

打印size_t類型的值要小心,這是無符號值,如果選錯格式說明符,可能會得到不可靠的結果,推薦的格式說明符是%zu,在某些情況下可以考慮用%u或%lu替代

二、ptrdiff_t類型

ptrdiff_t是C99標準庫中定義的一個與機器相關的數據類型,定義在stddef.h這個文件內。ptrdiff_t類型變量通常用來保存兩個指針減法操作的結果。
ptrdiff_t通常被定義為long int類型,size_t 是unsigned 類型,而 ptrdiff_t 則是 signed 整型。
這兩種類型的差別體現了它們各自的用途:size_t 類型用于指明數組長度,它必須是一個正數;ptrdiff_t 類型則應保證足以存放同一數組中兩個指針之間的差距,它有可能是負數。

#include<stdio.h>#include<stddef.h>#include<string.h>int main(void){  char str[] = "Hello world!";  char *pstart = str;  char *pend = str + strlen(str);  ptrdiff_t difp = pend - pstart;  printf("%d/n", difp);  return 0;}

三、intptr_t與uintptr_t類型

intptr_t與uintptr_t類型用來存放指針地址,它們提供了一種可移植且安全的方法聲明指針,而且與系統中使用的指針的長度相同,對于把指針轉化為整數形式很有用。uintptr_t是intptr_t的無符號版本

關于intptr_t的類型定義如下:

/* Types for `void *' pointers. */#if __WORDSIZE == 64# ifndef __intptr_t_definedtypedef long int        intptr_t;# define __intptr_t_defined# endiftypedef unsigned long int  uintptr_t;#else# ifndef __intptr_t_definedtypedef int          intptr_t;# define __intptr_t_defined# endiftypedef unsigned int    uintptr_t;#endif

從定義可以看出,intptr_t在不同的平臺是不一樣的,始終與地址位數相同,因此用來存放地址。

概念上, 盡管地址是指針, 內存管理常常使用一個無符號的整數類型更好地完成; 內核對待物理內存如同一個大數組, 并且內存地址只是一個數組索引. 進一步地, 一個指針容易解引用; 當直接處理內存存取時, 你幾乎從不想以這種方式解引用. 使用一個整數類型避免了這種解引用, 因此避免了 bug. 因此, 內核中通常的內存地址常常是 unsigned long, 利用了指針和長整型一直是相同大小的這個事實, 至少在 Linux 目前支持的所有平臺上.C99 標準定義了 intptr_t 和 uintptr_t 類型給一個可以持有一個指針值的整型變量

測試代碼:

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <stdint.h>#include <string.h>#include <assert.h>#define ID_STR_LEN  12#define NAME_STR_LEN 10typedef struct student{  char id[ID_STR_LEN];  char name[NAME_STR_LEN];  uint8_t age;}student;student * create_student(){  student *stu = (student *)malloc(sizeof(student));  if (stu == NULL)  return NULL;  memset(stu, 0, sizeof(student));  return stu;}void *free_student(student *stu){  if (stu)  free(stu);  return 0;}static void init_student(student * stu){  assert(stu);  const char *id = "2013112210";  const char *name = "Anker";  uint8_t age = 21;  memcpy(stu->id, id, strlen(id));  memcpy(stu->name, name, strlen(name));  stu->age = age;}static int handle_student(intptr_t handle){  if (handle == 0)  {  return -1;  }  student *stu = (student*)handle;  printf("id: %s/n", stu->id);  printf("name: %s/n", stu->name);  printf("age: %u/n", stu->age);  return 0;}int main(void){  student *stu;  stu = create_student();  init_student(stu);  //將指針轉換為intptr_t類型  intptr_t handle = (intptr_t)stu;  handle_student(handle);  free_student(stu);  return 0;}

希望本文所述實例對大家C程序設計的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色无极亚洲影院| 成人性生交xxxxx网站| 欧美猛男性生活免费| 97视频在线观看视频免费视频| 91精品国产九九九久久久亚洲| 欧美日韩国产激情| 亚洲色图国产精品| 亚洲精品国产拍免费91在线| 欧美精品日韩三级| 国产精品91在线观看| 亚洲性夜色噜噜噜7777| 国产精品久久99久久| 91免费看片在线| 疯狂做受xxxx欧美肥白少妇| 91高清在线免费观看| 日韩成人在线网站| 亚洲国产欧美自拍| 2025国产精品视频| 激情亚洲一区二区三区四区| 亚洲自拍小视频免费观看| 成人免费在线视频网址| 欧美性理论片在线观看片免费| 欧美日本黄视频| 国产一区二区三区精品久久久| 国产区精品在线观看| 国产美女精品视频免费观看| 日韩精品中文字幕有码专区| 成人黄色大片在线免费观看| 国产精品久久久久久久久粉嫩av| 成人久久久久久久| 亚洲的天堂在线中文字幕| 日韩在线观看视频免费| 久久久久久久色| 国产精品日日做人人爱| 一区二区欧美久久| 欧美色图在线视频| 国产精品久久久久久久久久小说| 久久综合伊人77777蜜臀| 精品视频—区二区三区免费| 黄色精品一区二区| 在线观看不卡av| 国产精品久久99久久| 欧美福利视频在线观看| 一区二区欧美久久| 狠狠干狠狠久久| 日韩精品日韩在线观看| 国产精品网站大全| 91精品国产综合久久久久久久久| 欧美性猛交xxxx久久久| 国产精品青青在线观看爽香蕉| 国产中文欧美精品| 国产精品免费看久久久香蕉| 亚洲午夜精品久久久久久久久久久久| 欧美在线不卡区| 福利一区视频在线观看| 日韩美女免费视频| 国产精品爱久久久久久久| 亚洲欧美日韩中文视频| 一区二区三区四区视频| 国产成人精品视| 91免费观看网站| 国产视频精品va久久久久久| 中文字幕欧美在线| 亚洲网站在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 91国产精品电影| 免费91麻豆精品国产自产在线观看| 欧美日韩亚洲国产一区| 欧美激情精品久久久| 欧美第一页在线| 性欧美亚洲xxxx乳在线观看| 亚洲国产日韩欧美综合久久| 欧美日韩一区二区三区| 欧美激情2020午夜免费观看| 国产精品视频久久久久| 国产精品十八以下禁看| 国产精品video| 亚洲成av人乱码色午夜| 91黑丝高跟在线| 国产精品普通话| 欧美性猛交xxxx免费看久久久| xvideos亚洲| 91欧美日韩一区| 国产乱人伦真实精品视频| 国产精品入口日韩视频大尺度| 国产精品偷伦免费视频观看的| 国产精品入口夜色视频大尺度| 国产日韩精品入口| 91精品国产99| 精品国产精品三级精品av网址| 日韩欧美在线第一页| 亚洲欧洲午夜一线一品| 国产一区二区三区精品久久久| 亚洲国产日韩一区| 日韩精品视频在线观看免费| 国产精品精品久久久久久| 亚洲最大福利视频网站| 亚洲免费高清视频| 亚洲最大av网站| 国产aⅴ夜夜欢一区二区三区| 中文字幕在线日韩| 欧美床上激情在线观看| 91精品国产高清自在线| 69国产精品成人在线播放| 欧美性猛交xxxx久久久| 精品国产欧美一区二区五十路| 少妇高潮 亚洲精品| 97在线视频国产| 青青草精品毛片| 中文字幕在线观看日韩| 国产精自产拍久久久久久蜜| 国产精品久久久久高潮| 成人午夜在线视频一区| 日韩在线观看免费高清| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲精品白浆高清久久久久久| 美乳少妇欧美精品| 97婷婷涩涩精品一区| 国产脚交av在线一区二区| 久久亚洲综合国产精品99麻豆精品福利| 在线免费看av不卡| 91av视频在线观看| 色av吧综合网| 北条麻妃在线一区二区| 精品久久久久久久中文字幕| 日韩成人免费视频| 成人亚洲欧美一区二区三区| 97国产精品视频| 日韩av在线直播| 国产精品电影久久久久电影网| 欧美亚洲国产另类| 亚洲片国产一区一级在线观看| 成人精品一区二区三区电影免费| 欧美做受高潮电影o| 成人免费视频97| 亚洲精品国产综合久久| 欧美午夜www高清视频| 国产精品一区专区欧美日韩| 亚洲成人黄色网| 热99精品只有里视频精品| 51精品在线观看| 精品国产成人av| 亚洲大尺度美女在线| 激情av一区二区| 国产成人久久精品| 国产精品v日韩精品| 国产精品视频导航| 日韩精品亚洲元码| 第一福利永久视频精品| 久久久久久久久久久网站| 欧美极品在线播放| 成人福利在线视频| 久久成人免费视频| 国产亚洲福利一区| 欧美亚洲另类视频| 亚洲欧美综合精品久久成人| 欧美一区二三区| 国内精品久久久久久影视8| 狠狠躁夜夜躁人人躁婷婷91| 国产精品91久久| 日韩av在线网| 亚洲第一网站男人都懂| 亚洲最大的免费| 深夜福利一区二区|