1. 程式人生 > >怎麼能讓一個不理解二級指標的人理解二級指標

怎麼能讓一個不理解二級指標的人理解二級指標

void swap( int *x , int *y )
{
	int tmp;
	tmp = *x;
	*x = *y;
	*y = tmp;
}

int main()
{
	swap( &a , &b );
	printf("a = %d , b = %d\n" , a , b );
	return 0;
}

 函式傳參是值傳遞,所以這就是為什麼要實現兩個值互換要傳指標也就是兩個值的地址進去的原因。要互換兩個地址裡的值,所以要把一個值暫存起來,所以int tmp;接著解引用x,把x地址裡的值賦給tmp,再把y地址裡的值賦給x,tmp值賦給y的解引用。

那麼要實現指標互換的話,就需要二級指標了。

結果無知的我寫出了下面的程式碼 

char *a = "123";
char *b = "456";
void swap( char *tmp1 , char *tmp2 )
{
	char *str = (char *)malloc(10);
	strcpy( str , tmp1 );
	strcpy( tmp1 , tmp2 );
	strcpy( tmp2 , str );
	free(str);
}

int main()
{
	printf("%s , %s\n" , a , b );
	swap( a , b );
	printf("%s , %s\n" , a , b );
	return 0;
}

這程式碼有幾個問題,第一是strcpy( tmp1 , tmp2 );給指向常量的指標賦值了

第二是這樣是修改了值,並沒有修改指標,雖然看起來現象是一致的。

所以又發現了一個坑。修改完是這樣的

void swap( char *tmp1 , char *tmp2 )
{
	char *str = (char *)malloc(4);
	strcpy( str , tmp1 );	
	strcpy( tmp1 , tmp2 );
	strcpy( tmp2 , str );
	free(str);
}

int main()
{
	char *a = (char *)malloc(4);
	char *b = (char *)malloc(4);
	memset(a,0x41,4);
	memset(b,0x42,4);
	
	printf("%s , %s\n" , a , b );
	swap( a , b );
	printf("%s , %s\n" , a , b );
	return 0;
}

所以還得二級指標,對不起打擾了。

void swap( char **tmp1 , char **tmp2 )
{
	int *str = (char *)malloc(4);
	*str = *tmp1;
	*tmp1 = *tmp2;
	*tmp2 = *str;
	free(str);
}

int main()
{
	char *a = (char *)malloc(4);
	char *b = (char *)malloc(4);
	memset(a,0x41,4);
	memset(b,0x42,4);
	
	printf("%s , %s\n" , a , b );
	swap( &a , &b );
	printf("%s , %s\n" , a , b );
	return 0;
}

這裡注意為什麼區域性變數str是int型別?因為裡邊存的是地址,4位元組,所以定義成int了 。理解二級指標使用的時候可以吧*tmp1看成一個整體來考慮,不考慮tmp1本身還是個指標這一點。反正我比原來理解多了。哈哈哈,感覺沒說明白