該編文章是收集網絡上有關指針題目並對其進行整理,其目的是加深對指針的理解,使自己對指針理解更加透徹。文章以講解題目爲主同時在原有題目基礎上進行拓展。
一些理解不正確的地方,希望各位指正! 謝謝
文章爲原創,轉載請註明出處,謝謝 ;
作者 : 飛哥
1.請說明以下定義指針之間的區別:
char const * p1;
char * const p2;
char const * const p3;
const char * const p4;
1) p1 稱之爲: 常量指針,就是指向常量的指針,該指針的目標不可被修改,但是指針本身可以被修改。
例如:
int n = 100;
const int* p = &n; // int const* p;
*p = 200; // error !
int m = 1000;
p = &m;
(*p)++; // error !
2) p2 稱之爲 : 指針常量就是指針類型的常量,該指針本身不能被修改,但是指針的目標可以被修改。
例如:
int n = 100;
int* const p = &n;
*p = 200; // ok !
int m = 1000;
p = &m; // error !
3)p3和p4指針是意義是相同的,稱之爲: 常量指針常量,指針本身和它的目標都是常量,都不可被修改。
這兩個指針比較好理解,我再次不再贅述;
例如:
int n = 100, m = 1000;
const int* const p = &n;
*p = 200; // error !
p = &m; // error !
結論: 1.常量指針,是常量不可以被修改,或者說指向不改變;
2.指針常量,是指針本身不能被修改;或者說指向可以改變;
爲避免混淆,您可以這樣理解:
口頭提問時 : 常量指針和指針常量區別: "指針"開頭表示指針本身不能被修改,"常量"開頭表示指向的內容不能被修改;
自己理解時 : " * " 後有const表示指針不能被改變; “ * ” 前有const表示指針指向的目標不能被改變;
2.指針和引用區別
3.請說明下面輸出結果
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
結果是:0 0 1 1
str1,str2,str3,str4是數組變量,它們有各自的內存空間;
而str5,str6,str7,str8是指針,它們指向相同的常量區域。
4.下面輸出數組大小的函數有沒有問題?
int Strlen(char str[])
{
return (int)(sizeof(str)-1);
}
有問題,函數 strlen(char str[])與strlen(char* pStr)寫法的含義相同,在形參與實參結合過程中,5.說說下面兩者的區別:
char a[] =“abcdefg”;
那麼,p[i]與a[i]的區別?
p[i]是先獲取符號表p地址的內容,然後在該內容上+i地址處獲取內容,即爲間接引用。這裏的“間接”指的是要被操作的地址不能直接從編譯器符號表 中直接獲得,而是從指針對象中獲得。
int *ptr=(int *)(&a+1);
printf("%d,%d/n",*(a+1),*(ptr-1));
輸出結果是什麼?
void get_memory(char *p)
{
p = (char *)malloc(sizeof(char) * 100);
}
void test(void)
{
char *str = NULL;
get_memory(str);
strcpy(str, "hello world");
printf("%s\n", str);
}
答案: 段錯誤