c語言關於陣列的簡單運算

audience_fzn發表於2018-08-02

我們可以通過陣列名+整數的運算,獲取到陣列每一個元素的地址

int arr[10] = { 0 };
int i = 0;
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
{
    printf("&arr[%d] = %p\n", i, &arr[i]);
    printf("%p\n", arr + i);
}

陣列名+i<==>第i個元素的地址

*(陣列名+i)<==> 第i個元素

 

1.
 

    int a[] = { 1, 2, 3, 4 };
//sizeof單位是位元組
    printf("%d\n", sizeof(a)); //16 ,sizeof(陣列名)表示整個陣列
    printf("%d\n", sizeof(a+0));//4,首元素的地址+0,還是首元素的地址
    printf("%d\n", sizeof(*a));//4,首元素‘1’,int型別
    printf("%d\n", sizeof(a+1));//4,第二個元素的地址
    printf("%d\n", sizeof(a[1]));//4,第二個元素
    printf("%d\n", sizeof(&a));//4,首元素的地址
    printf("%d\n", sizeof(&a+1));//4,跳過整個陣列的下一個地址
    printf("%d\n", sizeof(&a[0]));//4,第一個元素的地址
    printf("%d\n", sizeof(&a[0]+1));//4,第二個元素的地址
    printf("%d\n", sizeof(*&a));//16,&a是整個陣列的地址,解引用訪問整個陣列

注:

arr+1:第二個元素的地址

&arr+1:跳過整個陣列的下一個地址

2. 

char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr));//6
printf("%d\n", sizeof(arr+0));//4
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4
printf("%d\n", sizeof(&arr+1));//4
printf("%d\n", sizeof(&arr[0]+1));//4
printf("%d\n", sizeof(*&arr));//6

 

        char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
        //strlen()函式遇到‘/0’結束
	printf("%d\n", strlen(arr));//隨機值
	printf("%d\n", strlen(arr+0));//隨機值
	//printf("%d\n", strlen(*arr));//訪問記憶體出錯,*arr是‘a’
	//printf("%d\n", strlen(arr[1]));//訪問記憶體出錯,arr[1]是‘b’
	printf("%d\n", strlen(&arr));//隨機值
	printf("%d\n", strlen(&arr+1));//隨機值
	printf("%d\n", strlen(&arr[0]+1));//從b向後數,隨機值

 3.

	char *p = "abcdef";
	printf("%d\n", sizeof(p));//指標,4
	printf("%d\n", sizeof(p+1));//4
	printf("%d\n", sizeof(*p));//1,a
	printf("%d\n", sizeof(p[0]));//1,a
	printf("%d\n", sizeof(&p));//4
	printf("%d\n", sizeof(&p+1));//4
	printf("%d\n", sizeof(&p[0]));//4

char *p="abcdef";

p中存放的‘a’的地址

1)先將“abcdef”放在記憶體裡

2)在向記憶體申請四位元組(p),用來存放地址

3)把a字元的地址放在的p中,每次用時從後向後找

所以sizeof(*p),是1,因為p裡面只有a 的地址

        char *p = "abcdef";
	printf("%d\n", strlen(p));//6
	printf("%d\n", strlen(p+1));//5
	//printf("%d\n", strlen(*p));//錯誤,*p=‘a’
	//printf("%d\n", strlen(p[0]));//錯誤,p[0] = 'a'
	//printf("%d\n", strlen(&p));//隨機值
	//printf("%d\n", strlen(&p+1));//隨機值
	printf("%d\n", strlen(&p[0]));//6
	printf("%d\n", strlen(&p[0])+1);//隨機值

4.

​	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//7,整個陣列
	printf("%d\n", sizeof(arr + 0));//4,首元素地址+0,還是首元素地址
	printf("%d\n", sizeof(*arr));//1,首元素地址解引用,a
	printf("%d\n", sizeof(arr[1]));//1,首元素,a
	printf("%d\n", sizeof(&arr));//4,地址
	printf("%d\n", sizeof(*&arr));//7,整個陣列
	printf("%d\n", sizeof(&arr + 1));//4,地址
	printf("%d\n", sizeof(&arr[0] + 1));//4,地址值​

        char arr[] = "abcdef";
	printf("%d\n", strlen(arr));//6
	printf("%d\n", strlen(arr+0));//6
	//printf("%d\n", strlen(*arr));//錯誤'a'
	//printf("%d\n", strlen(arr[1]));//錯誤'b'
	printf("%d\n", strlen(&arr));//6
	printf("%d\n", strlen(*&arr));//6
	printf("%d\n", strlen(&arr+1));//隨機值
	printf("%d\n", strlen(&arr[0]+1));//5

二維陣列:


	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//48
	printf("%d\n", sizeof(a[0][0]));//4
	printf("%d\n", sizeof(a[0]));//16
	printf("%d\n", sizeof(a[0]+1));//4
	printf("%d\n", sizeof(a+1));//4
	printf("%d\n", sizeof(&a[0]+1));//4
	printf("%d\n", sizeof(*a));//16
	printf("%d\n", sizeof(a[3]));//16

 

a[0]單獨放在sizeof內部,表示第一行的地址,(a[0]+1)放在sizeof內部,a[0]發生降級,表示第一行第一個元素的地址,a[0]+1為第一行第二個元素的地址

相關文章