C語言進階:第28課:指針和數組分析(上)

數組的本質:

數組是一段連續的內存空間

數組的空間大小爲

sizeof(array_type)*array_size
數組名可以看做指向數組第一個元素的常量指針。
問題:  a+1的意義是什麼?結果是什麼?
    指針運算的意義是什麼?結果是什麼?
int main()
{   
    int a[5] = {1, 2, 3, 4, 5};  
    int* p = NULL;
    
    printf("a = 0x%X\n", (unsigned int)(a));
    printf("a + 1 = 0x%X\n", (unsigned int)(a+1));//0 + sizeof(*a)  = 0xBFEA4998 + sizeof(a[0])
    printf("&a + 1 = 0x%X\n", (unsigned int)(&a+1));
    printf("%d\n", *(a+1));
    
    //p = a;
    
    printf("p = 0x%X\n", (unsigned int)(p));
    printf("p + 1 = 0x%X\n", (unsigned int)(p+1));// 0 + sizof(*P)

	return 0;
}

編譯運行:

a = 0xBFEA4998
a + 1 = 0xBFEA499C
&a + 1 = 0xBFEA49AC
2
p = 0x0
p + 1 = 0x4

指針是一種特殊的變量,與整數的運算規則爲

	p+n  <---> (unsigned int)p + n * sizeof(p)
結論:

當指針p指向一個同類型的數組的元素時:p+1將指向當前元素的下一個元素;p-1將指向當前元素的上一個元素。

指針之間只支持減法運算

參與減法運算的指針類型必須相同

p1-p2; <---> ( (unsigned int)p1 - (unsigned int)p2) / sizeof(type)
注意:
1、只有當兩個指針指向同一個數組中的元素時,指針相減纔有意義,其意義爲指針所指元素的下標差;

2、當兩個指針指向的元素不在同一個數組中時,結果未定義(編譯通過並不代表語法上不合法)。

指針的比較:
指針可以進行關係運算(<, <=, >, >=)
指針關係運算的前提同時指向同一個數組中的元素
任意兩個指針之間的比較運算(==, !=)無限制;
參與比較運算的指針類型必須相同。

#include <stdio.h>

#define DIM(a) (sizeof(a) / sizeof(*a))

int main()
{
    char s[] = {'H', 'e', 'l', 'l', 'o'};
    char* pBegin = s;
    char* pEnd = s + DIM(s); // Key point
    char* p = NULL;
    
    printf("pBegin = %p\n", pBegin);
    printf("pEnd = %p\n", pEnd);
    
    printf("Size: %d\n", pEnd - pBegin);
	
    for(p=pBegin; p<pEnd; p++)
    {
        printf("%c", *p);
    }
    
    printf("\n");
   
    return 0;
}

數組聲明時編譯器自動分配一篇連續的內存空間

指針聲明時只分配了用於容納地址值的4字節空間

指數和整數可以進行運算,其結果爲指針

指針之間只支持減法運算,其結果爲數組元素的下標差

指針之間支持比較運算,其類型必須相同

發佈了83 篇原創文章 · 獲贊 12 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章