C/C++筆記(C語言重要問題,指針與數組篇)

配合內存四區看,
http://blog.csdn.net/dajiabudongdao/article/details/51945041

一、指針的本質

指針的本質就是4字節。

研究指針的步驟:
1. 別看星,看變量:如int ******p = &a;

2. 兩次取地址無意義,因爲&a就是個數。如:&&a無意義,這麼寫就直接報錯了

指針聲明與使用,星號(*)表示的含義不同。

3. 指針聲明時,*表示聲明的變量爲指針
4. 指針使用時,*表示操作指針所指向的內存空間值。
指針使用時,*p相當於通過地址p找到一塊內存;然後操作內存

指針使用時,*p放在等號左邊給內存賦值,放等號右邊從內存中獲取值。

二、野指針問題

if(p1!=NULL)
{
     free(p1);
}

這麼寫,會運行兩次free(p1)_,容易down機。

因爲free(p1)第一次之後,雖然空間被釋放,但p1的值沒有變指向一個有值的地方,但是不能用的地方。這種亂指我們叫野指針。

建議這麼寫
if(p1!=NULL)
{
     free(p1);
     p1=NULL;
}

三、數組的本質

數組名的本質就是指針。下面是指針與數組推導關係:

a[i] --->a[0+i]---> *(a+i)
a[i][j]---> *(a[0]+j)--->*( *(a+i) + j)
i代表步長。
a+i 代表整個第i行地址
*(a+i)代表第i行首地址

下面是學習C語言學習中常見的交換位置的函數。。看看運行後會有什麼結果?(6個常見的寫法)

void exchange(char a,char b)
{ 
char c = a;
 a = b;
 b = c;
}
int main()
{ 
	char q = 'q'; 
	char p = 'p'; 
	exchange(p,q);
 	printf("%c,%c",p,q);
 	return 0;
}

void exchange(char* a,char* b)
{ 
char *c = a;
 a = b;
 b = c;
}
int main()
{ 
	char q = 'q'; 
	char p = 'p'; 
	exchange(p,q);
 	printf("%c,%c",p,q);
 	return 0;
}

void exchange(char* a,char* b)
{ 
Char* c = a;
 a = b;
 b = c;
}
int main()
{ 
	char* q = 'q'; 
	char* p = 'p'; 
	exchange(p,q);
 	printf("%c,%c",*p,*q);
 	return 0;
}

void exchange(char* a,char* b)
{ 
char c = *a;
 *a = *b;
 *b = c;
}
int main()
{ 
	char q = 'q'; 
	char p = 'p'; 
	exchange(&p,&q);
 	printf("%c,%c",p,q);
 	return 0;
}


void exchange(char* a,char* b)
{ 
char* c = a;
 a = b;
 b = c;
}
int main()
{ 
	char q = 'q'; 
	char p = 'p'; 
	exchange(&p,&q);
 	printf("%c,%c",p,q);
 	return 0;
}

void exchange(char* a,char* b)
{ 
char c = *a;
 *a = *b;
 *b = *c;
}
int main()
{ 
	char q = 'q'; 
	char p = 'p'; 
	exchange(&p,&q);
 	printf("%c,%c",p,q);
 	return 0;
}



四、數組(指針)的使用



1. 數組與字符串類似。但不強硬以‘\0’結尾,上一節推出來下面這幾個數組間的重要公式:
a[i] --->a[0+i]---> *(a+i)
a[i][j]---> *(a[0]+j)--->*( *(a+i) + j)
a+i 代表整個第行地址
*(a+i)代表第i行首地址
void f(int a[3][5]) ----> void f(int (*b)[5])
2. 數組應用場景
C語言中,數組的應用場景很多。
1. 菜單
char* ckey[]={"while","case","static","do"} ;

2. int main(int argc,char* argv[],char ** env)
操作系統打造了環境。也就是說,上面的那些指針指向的內存內容都是來自操作系統。

3. 指針數組自我結束能力
char* ckey[]={"while","case","static","do",'\0'} ;
for( int i = 0 ; ckey[i]!=NULL ; )

*****4. 指針可以使函數內外同時操縱同一片內存空間,間接賦值是指針存在的最大意義(數組也可以)。
指針是C/C++的精華。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章