首页
/
每日頭條
/
科技
/
c語言各個數據類型取值範圍
c語言各個數據類型取值範圍
更新时间:2025-04-03 18:25:25

c語言各個數據類型取值範圍?指針變量指向指針(地址),如何解引用二進制序列?需要确定這個二進制序列的長度以及解碼規則,這也就是指向的數據類型由此,指針的算術運算也與其指向的類型密切相關,現在小編就來說說關于c語言各個數據類型取值範圍?下面内容希望能幫助到你,我們來一起看看吧!

c語言各個數據類型取值範圍(深入理解與數據類型相關的指針變量的算術運算)1

c語言各個數據類型取值範圍

指針變量指向指針(地址),如何解引用二進制序列?需要确定這個二進制序列的長度以及解碼規則,這也就是指向的數據類型。由此,指針的算術運算也與其指向的類型密切相關。

指針變量的算術運算主要有兩類:

I 地址偏移

II 兩個地址之間的差值

電子計算機以字節為單位進行編址,指針變量的算術運算以指針(地址)為運算對象,但并不單純以字節為計算單位,而是以其指向的數據類型的大小為單位進行偏移或計算差值。

還可以從表達式的類型一緻來理解,在C語言中,表達式的類型需要一緻,但指針的算術運算如何達成一緻?指針是地址,是一個整數,當然是一個合法地址,且具有類型信息,由此,與其運算的整數也不再是一個單純的整數,而是具有類型信息的。

記住指針的偏移或算術運算的單位是元素的個數而不是byte數量,在計算新地址時千萬别弄錯了。

1 地址偏移

p±n == (char*)p ± n*sizeof(*p)

void ptrCal() { int a[10],*p,*q; for(int i=0;i<10;i ) a[i] = i; p = a; q = a 2; int b = a[q-p]; printf("%d\n",b); // 2 b = (int)q - (int)p; printf("%d\n",b); // 8 }

2 兩個地址之間的差值

p-q = ±n

如果指針變量指向的類型是char類型,則指向類型的大小與單個字節的長度完全統一,兩者具有天然的同步性。

int strLen(const char* strP) { const char* p = strP; while(*p != '\0'); return p-strP-1; }

3 指針指向數組時,相關的指針運算

除了在聲明中或者當一個數組名是sizeof運算符或&運算符的操作數之外,編譯器總是把數組名解釋成指向它的第一個元素的指針。可以将這個原則表達為:

arr == &a[0] 或者

arr == &*a

n維數組arr,基首元素的地址是n-1維的&a[0]

int arr[2][3][4];

int (*p)[3][4] = &arr[0];

int (*q)[3][4] = &*arr;

int (*r)[3][4] = arr;

void arrPtr() { int a[3]; int b[3][4]; int c[3][4][5]; int i = sizeof a / sizeof *a; // 運算符sizeof的上下文,數組名表示整個數組 int j = sizeof b / sizeof *b; int k = sizeof c / sizeof *c; printf("%d,%d,%d\n",i,j,k); // 3,3,3 int(*pp)[3] = &a 1; //運算符&的上下文,數組名表示整個數組 int(*qq)[3][4] = &b 1; int(*rr)[3][4][5] = &c 1; int l = (int)pp-(int)a; int m = (int)qq-(int)b; int n = (int)rr-(int)c; printf("%d,%d,%d\n",l,m,n); // 12,48,240 int *p = a; //以上兩種情況以外的上下文,數組名表示數組首元素的地址 int (*q)[4] = b; int (*r)[4][5] = c; *(p 2) = 3; *(*(q 2) 3) = 3*4; *(*(*(r 2) 3) 4) = 3*4*5; // printf("%d,%d,%d\n",a[2],b[2][3],c[2][3][4]);// 3,12,60 // 在數組名表示數組首元素的地址,數組名 n表示數組元素的偏移, // 其偏移的字節數自然是數組元素的長度,n維數組的元素是n-1維數組, // n-1維都需要有确定的長度信息 }

對于二維數組

arr[N][M]

其元素

arr[i][j]

便是指針寫法

*(*(arr i) j)

的語法糖。在指針寫法的表達式中,其偏移有意義的前提就是arr必須轉換為指向數組首元素的指針。

對指針進行加1 操作,得到的是下一個元素的地址,而不是原有地址值直接加1。所以,一個類型為 T 的指針的移動,以sizeof(T) 為移動單位。如果有數組arr:

arr 1 代表是的數組首元素的地址即a[0]的首地址。

&a 1 代表的是數組的首地址,

兩者指向的地址相同,但類型及代表的長度不同,所以有不同的移動。

單重循環處理二維數組:

#include <stdio.h> int main() { const int M = 3; const int N = 4; int arr[M][N] = {0}; for(int i=0;i<M*N;i ) arr[i/N][i%N] = i; // 單重循環處理二維數組 int (*pArr)[N] = arr; for(i=0;i<M*N;i ){ if(i%N==0) printf("\n"); printf("%d ",*(*(pArr i/N) i%N)); } printf("\n"); for(i=0;i<M;i ){ for(int j=0;j<N;j ) printf("%d ",arr[i][j]); printf("\n"); } getchar(); return 0; }

結構體成員的偏移:

結構體成員的字節對齊,有利于提高數據的訪問速度(CPU一次讀取一個字長(32位平台是4個字節)的字節數),是典型的以空間換時間的案例。

結構體類型變量相對于結構體成員,如果數組名之于數組成員一樣,提供的是一個基準地址,成員地址是相對于基準的偏移。不同的是,數組名是一個常量,不能用做左值(可以在聲明的同時初始化),結構體變量是可以做左值的。(依序器如此規定也有其合理性,數組是數組名 索引确定分量地址,而結構體是由結構體變量 結構體分量确定分量地址,數組名做為分量的索引的基準需要保持不變)

#include <stdio.h> #include <iostream> void structMemberOffset() { struct Student { int grade; char id[11]; char name[20]; char sex; double chinese; double math; }; printf("%d\n",sizeof Student); //56 printf("%d\n",offsetof(Student,chinese)); // 40 = 4 12 20 4 Student stu; int n = int(&stu.chinese)-int(&stu); // 40 printf("%d\n",n); } int main() { structMemberOffset(); return 0; }

-End-

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
一加10啥時候出
一加10啥時候出
小道消息人士YogeshBrar透露,一加(OnePlus)正在研發一款代号為“Ovaltine”的新機,采用高通骁龍8Gen1處理器,應該就是謠傳中的一加10手機。消息稱該機将在今年晚些時候推出,但是目前還沒有具體的日期消息。據爆料人稱,...
2025-04-03
歐姆龍行程開關選型手冊
歐姆龍行程開關選型手冊
歐姆龍可編程控制器CJ系列CJ1W-CLKControllerLink單元新型ControllerLink單元,發送字數為4,000歐姆龍可編程控制器CJ系列CJ1W-CLKControllerLink單元特點無需編程,隻需設置數據鍊接表即...
2025-04-03
聯想鍵盤紫色接口
聯想鍵盤紫色接口
更多科技新品介紹,歡迎點擊右上角關注我~如果要評選年度積灰電子産品,我提名Kindle差友們應該沒有異議吧?但各位要相信一句話:技術是沒有對錯的。大部分人的Kindle,之所以淪落到被用來壓泡面盒子的地步,隻是因為他們不想讀書罷了。才不是因...
2025-04-03
4大空間8大系統
4大空間8大系統
自從iOS7開辟了智能手機新系統扁平化設計的先河以後,各大手機品牌的系統UI設計風格便在這條路上逐漸靠攏了,更為嚴重的是,近年來,各家的系統還在功能上也呈現出了趨同,如今沉悶的手機市場太需要一股新鮮空氣了,但就在近日,阿布在一個名為Ocea...
2025-04-03
scr故障代碼大全
scr故障代碼大全
SCR系統工作原理是在催化劑作用下,氨氣(NH3)優先選擇與尾氣中的氮氧化合物(NOX)發生反應,生成氮氣和水,而不是和氧氣發生反應。氨氣(NH3)是有強烈刺激性氣味的無色氣體,存儲運輸不便,工程實踐中,車輛存儲還原劑為尿素和水的溶液,尿素...
2025-04-03
Copyright 2023-2025 - www.tftnews.com All Rights Reserved