1. 程式人生 > >指標學習心得與理解

指標學習心得與理解

  在C語言的學習過程中,指標是相當重要的一部分,學好指標對C的學習有很重要的意義。

  1. 指標和記憶體

如果說記憶體相當於街道,那麼地址就相當於位於街道中房子的房號。

一個位元組(8bit)包含一個地址。記憶體中每一個位置都包含一個獨一無二的地址標識,而每一個位置都包含一個值。

注意:①區別指標變數的內容(即地址)、指標指向變數的內容、指標的地址。

      ②*p分別作為左值和右值時具有不同的意義

        *p放在“=”左邊表示p指向的空間

        *p放在“=”右邊表示解引用p

      ③在對指標進行初始化的時候有兩種非法情況

      如:int *pa;→這是未初始化的指標,這種做法是不行的

          *pa=10;

          int *pret=fun();→這是個非法的指標,不能將一個函式直接賦給一個指標變數

          *pret=20;

2.指標常量

例:

*((int *)0x0018ff44)=20

其中0x0018ff44是一個常量,不能直接引用,需強制型別轉換為一個整型地址    

改為:int a=10;

      *((int *)0x0018ff44)=30;

   此時a=30;

3.指標的指標

例:①int *p=NULL;

    int **ptr=&p;→二級指標變數儲存一級變數的地址

    ②int a=10; 

     int *p=&;→想要將a的內容變成20,則可以寫成*p=20或者**q=20

4.指標運算

①對於一個指標變數*p,p+n後增加的位元組取決於p的資料型別,如果是一個char型別的,則增加n個位元組,如果是一個int型別的,則增加n*4個位元組。

②指標1-指標2之間的元素等於指標1和指標2之間元素的個數

③允許指向陣列元素的指標與指向陣列最後一個元素的指標進行比較,但不允許與指向第一個元素之間的記憶體進行比較。

例:用指標實現一個氣泡排序的函式


void bubble_sort(int arr[], int sz)
{
	int i = 0;
	int j = 0;
	int tmp = 0;
	for (i = 0; i < sz; i++)
	{
		for (j = 0; j <= sz - i - 1; j++)
		{
			if ((*arr + j)>(*arr + j + 1))
				tmp = *(arr + j);
				*(arr + j ) = *(arr + j+1);
			*(arr + j + 1) = tmp;
		}
	}

           學習初始,不足之處望指正。