1. 程式人生 > >C語言指標偏移技巧(也是一個要注意的坑)

C語言指標偏移技巧(也是一個要注意的坑)

      在C語言中,每個地址實際上指向一個8bit的記憶體區,但如果某個記憶體區的地址使用一個明確的型別指標例如int*、long*來進行保 存,那麼指標偏移時地址的偏移數以型別佔的位元組數為基本單位進行偏移,例如int *p變數+1的時候實際上跳過的是sizeof(int)的型別位元組數的地址為單位進行跳躍——也就是跳躍4個地址,但如果是不確認型別的情況下使用void*來儲存,則必須指定每次跳躍的準確地址數。

      以下是說明該機制的一個例子,測試平臺為windows,使用gcc編譯:

#include "stdio.h"
#include "stdlib.h"

void fun1(){
	int *data = malloc(sizeof(int) * 4);
	data[0] = 1;
	data[1] = 2;
	data[2] = 3;
	data[3] = 4;
	printf("%d\t%d\n", *data, *(data + 1));
}

void fun2(){
	void *data = malloc(sizeof(int) * 4);
	*(int*)(data + sizeof(int) * 0) = 1;
	*(int*)(data + sizeof(int) * 1) = 2;
	*(int*)(data + sizeof(int) * 2) = 3;
	*(int*)(data + sizeof(int) * 3) = 4;
	printf("%d\t%d\n", *(int*)data, *(int*)(data + sizeof(int) * 3));
}

void fun3(){
    int i;
    void *data = malloc(sizeof(int) * 4);
    int *data2 = malloc(sizeof(int) * 4);
    printf("\n");
    for(i = 0; i < 4; i++) {
        printf("test1:%d\n", data + i);
    }
    printf("\n");
    for(i = 0; i < 4; i++) {
        printf("test2:%d\n", data2 + i);
    }
}

int main(){
	fun1();
	fun2();
	fun3();
	return 0;
}

測試結果:

總結:指標的地址偏移的量和儲存這個地址的指標型別有關

相關推薦

C語言指標偏移技巧一個注意

      在C語言中,每個地址實際上指向一個8bit的記憶體區,但如果某個記憶體區的地址使用一個明確的型別指標例如int*、long*來進行保 存,那麼指標偏移時地址的偏移數以型別佔的位元組數為基本單位進行偏移,例如int *p變數+1的時候實際上跳過的是sizeof(in

C語言-計蒜客最後一個單詞的長度

一、問題給定由大寫,小寫字母和空格組成的字串,返回 最後 一個單詞的長度。如果輸入中不存在單詞,返回 00。注意:“單詞”是指不包含空格符號的字串例如:對於字串"hello World"(不帶引號), 那麼返回的結果是 55;對於字串"abc abc "(不帶引號),那麼返回

C語言指標的運算指標加或減一個整數的意義

        指標可以加上或減去一個整數。指標的這種運算的意義和通常的數值的加減運算的意義是不一樣的,以單元為單位。例一:#include<stdio.h> int main() { char a[]="0123456789"; int *ptr = (i

c語言指標進階

指標也是一種資料型別 指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。 1)指標是一種變數,佔有記憶體空間,用來儲存記憶體地址

c語言指標進階

指標與記憶體四區理解的強化 1)主調函式 被調函式 主調函式可把堆區棧區全域性區的資料記憶體地址傳給被調函式 被調函式只能返回堆區 全域性資料 2)記憶體分配方式 指標做函式引數 是有輸入輸出特性的 輸入指的是 在主函式分配記憶體 在子函式修改 輸出指的是 在子函式分

C語言編寫Copy程式Linux環境下的操作

COPY程式的編寫 (作者:Baron_wu 禁止轉載) 一、實驗描述 在這個實驗中,我們要做一個程式,這個程式是將一個檔案的內容複製到一個目標檔案。首先這個程式提示使用者輸入要複製的原始檔案的名字,以及要複製到的目標檔案的名字。 確保包括必要的錯誤檢查,包括確保原始檔案存在

(排序演算法)linux c語言實現快速排序氣泡排序的改進版

 快速排序演算法是對氣泡排序演算法的一種改進,氣泡排序是對單個元素的升降,快速排序是對所有元素的升降,不過這個升降是取了某一個標準的前提下,在本文程式碼中,就以a[i],其實就是以最左邊的元素為參考,比較交換之後,將這個參考元素放到分界的地方,即i的位置。 程式碼如下,裡面有比較詳細的

C語言實現householder變換數值計算方法課程設計

博主系某985資訊與計算科學大三,剛除錯成功,分享給正在學習數值計算的夥伴們,有問題還請大家批評指正。  #include <stdio.h> #include <stdlib.h> #include <math.h> #define N 100 s

BMP轉成C語言陣列檔案工具用image2lcd代替bmp2h exe

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C語言】多項式加法mooc第七週測試題

  這個小題目吧我折磨的夠嗆,,主要在於特殊情況考慮不周,測試用例老是通不過。。 小結: 做法:用一個數組來儲存多項式,用下標表示冪次數,陣列元素值表示對應係數 輸出特殊格式考慮:係數和冪次數為0,1,-1的情況,負係數的對加號輸出的影響   題目內容:

C語言讀取BMP檔案同時支援Linux和Windows

C語言讀取BMP檔案最關鍵的是要理解結構體對齊。一般情況下,C語言的結構體在記憶體中會按照4位元組(32位)或者8位元組(64位)對齊。BMP檔案的資料頭結構體按照位元組排列,而且不能對齊,所以需要用預編譯巨集設定不能對齊。 另外注意Linux下一般用UTF-8編碼,但是Windows下用GB2

C語言】佇列演示佇列的幾個函式

/* * 佇列演示(佇列的幾個函式) * */ typedef struct { int arr[SIZE]; int head; //記錄最前面數字所在的下標 int tail; //記錄最後一個有效數字的下一個座標

ITAT 第一屆 C語言程式設計 參考答案個人答案 僅供參考

全國“IT&AT”教育工程技能大賽試題C語言 1.輸入一個五位整數,將它反向輸出。例如輸入12345,輸出應為54321。(15分) 僅供參考: 方法一: 遞迴 #include <stdio.h> void invert(long m);

C語言輾轉相除法歐幾里德演算法求最大公約數

演算法敘述: 設(a,b)表示a和b的最大公約數 若c為a/b的餘數(c=a%b) 則(a,b)=(b,c). #include<stdio.h> int gcd(int a,int b

C語言參數傳遞值傳遞、地址傳遞+二級指針

strong 才有 color 示意圖 mage 影響 -s include expr 參數傳遞 C語言參數傳遞一般分為:值傳遞和地址傳遞 (註意:C語言中沒有引用傳遞,C++才有引用傳遞,因為很多C語言環境是用C++編譯器編譯,使得C看起來支持引用傳遞,導致很多網上很

C語言中關鍵字作用const和static和extern

儲存型別關鍵字(4個): auto: 宣告自動變數,現在一般不用(auto int a;和int a;一樣) register: 宣告暫存器變數 static: 宣告靜態變數。該變數宣告時系統所分配的

C語言實驗計算時間差小時,分鐘,秒

C語言實驗計算時間差(小時,分鐘,秒,只適用於同一天內) ```c #include <stdio.h> int main() { int hour1,min1,s1,ss1; int hour2,min2,s2,ss2; int

C語言基礎複習筆記指標

最近linux很火,年前對linux再詳細瞭解了個大概,結合在windows平臺活躍與強大無比的C++,最終得出一個結論:C語言依然強大。 過年回來,便對的C語言充滿了興趣,於是乎去網上下載了教程回來,細細研讀,基礎程式設計思想始終是很重要的。 首先,入手的便是C語言的核心精華部分,指標。要

C++找出一個二維陣列中的鞍點,即該位置上的元素在該行上最大,在該列上最小可能沒有鞍點

今日正式用csdn部落格記錄,回顧我所學到的知識,分享一些我的人生感悟和自身經歷。也希望未來通夠過此平臺和更多喜愛程式設計的人交流學習。 道聽途說再加上自己的感悟,認為程式設計最重要的是思想,而不是語言本身,語言只是個工具。所以我們得先學思想。遇到問題,應該先想如果是自己去做會怎麼處理,但我們不

C語言指標——對普通變數的指標操作和對陣列常量指標操作

       我們知道,每一個變數都有一個記憶體位置,每一個記憶體位置都定義了可使用連字號(&)運算子訪問的地址,它表示了在記憶體中的一個地址。        我們喜歡在程式中使用指標代替陣列,因為變數指標可