1. 程式人生 > >c語言--關於陣列與指標的一些基本運算

c語言--關於陣列與指標的一些基本運算

一.sizeof()的有關運算

1.知識:
  • 當陣列名a單獨放在sizeof()內部(即 sizeof(a))時,a表示整個陣列;當陣列名a單獨放在&後面時(即&a),a表示整個陣列;
  • 餘的a都表示陣列a首元素的地址;&a,表示陣列a的地址,其實是a首元素的地址,一個整形大小為4個位元組,一個字元型大小為1個位元組
2.相關計算
include<stdio.h>
int main()
{
    int a[] = {1,2,3,4};
    printf("%d\n",sizeof(a));    //整個陣列的大小                 16
    printf("%d\n",sizeof(a+0));   //首元素的地址加0,還是首元素的地址           4
    printf("%d\n",sizeof(*a));  //陣列a首元素的大小                4
    printf("%d\n",sizeof(a+1));  //陣列a首元素的地址加1,表示陣列第二個元素的地址的大小,地址為4個位元組     4
    printf("%d\n",sizeof(a[1]));   //陣列a第二個元素的大小              4
    printf("%d\n",sizeof(&a));   //陣列a首元素地址的大小                4
    printf("%d\n",sizeof(&a+1));   //陣列a下一個陣列(其他)的地址大小  4
    printf("%d\n",sizeof(&a[0]));  //陣列a首元素地址的大小             4
    printf("%d\n",sizeof(&a[0]+1));  //陣列a第二個元素的地址的大小     4
    return 0;
}


//字元陣列
#include<stdio.h>
int main()
{
	char arr[] = {'a','b','c','d','e','f'};  //arr[]表示一個字元陣列,裡面有6個元素,不包括\0,一個char型別大小為1個位元組
        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]));  //陣列第二個元素'b' 的大小   1
        printf("%d\n", sizeof(&arr));  //陣列首元素的地址            4
        printf("%d\n", sizeof(&arr+1));  //跳過整個陣列,後面內容的地址的大小  4
        printf("%d\n", sizeof(&arr[0]+1));   //陣列第二個元素的地址的大小   4
	
	return 0;
}

二.strlen()的有關運算

1.strlen()用來計算指定字串的長度,不包括結束字元“\0”;它會從首地址一直找下去,直到遇到"\0"停止。2.相關計算:
#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = {'a','b','c','d','e','f'};
	printf("%d\n", strlen(arr));
	//從陣列的首元素地址一直找下去,直到"\0"停止,該陣列不包括"\0",所以它會一直找下去,計算結果為一隨機數
    printf("%d\n", strlen(arr+0));
	//從陣列的首元素地址一直找下去,計算結果為一隨機數
    printf("%d\n", strlen(*arr));
	//*arr表示首元素,即'a',也就是從地址值為97開始找,但97是一個未知地址,不允許訪問,所以這題是錯誤的
    printf("%d\n", strlen(arr[1]));
	//arr[1],即'b',所以這題也是錯誤的
    printf("%d\n", strlen(&arr));
	//從陣列的首地址一直找下去,計算結果為一隨機數
    printf("%d\n", strlen(&arr+1));
	//從跳過這個陣列的地址開始找下去,計算結果為一隨機數,比上式大6
    printf("%d\n", strlen(&arr[0]+1));
   //從陣列的第二個元素的地址一直找下去,計算結果為一隨機數,比上式小5

	
	return 0;
}

2.
#include<stdio.h>
#include<string.h>
int main()
{
	char *p = "abcdef";//*p 表示字元型別的指標變數p
    printf("%d\n", sizeof(p));//p存放首元素a的地址,則結果為4
    printf("%d\n", sizeof(p+1));//p+1存放b的地址,結果為4
    printf("%d\n", sizeof(*p));//*p表示首元素,結果為1
    printf("%d\n", sizeof(p[0]));//表示首元素,結果為1
    printf("%d\n", sizeof(&p));//字元型別的指標變數p的地址大小,結果為4
    printf("%d\n", sizeof(&p+1));//指向下一個地址,仍然是地址,結果為4
    printf("%d\n", sizeof(&p[0]+1));//b的地址,結果為4

    printf("%d\n", strlen(p));//從a的地址一直找,直到遇到"\0"結束,結果為6
    printf("%d\n", strlen(p+1));//從b的地址一直找,直到遇到"\0"結束,結果為6
    printf("%d\n", strlen(*p));//錯誤,*p表示首元素,即'a',也就是從地址值為97開始找,但97是一個未知地址,不允許訪問,所以這題是錯誤的
    printf("%d\n", strlen(p[0]));//錯誤,與上式一樣
   
	return 0;
}