c语言巩固,巩固一下C语言中的指针
寫了幾段代碼,再鞏固一下C語言知識。
我的記憶方法跟文章中的不一樣。
*是取值符號,&取地址符號,()限定子表達(dá)式的符號,[]是按索引取數(shù)組乘員的符號。
優(yōu)先級方面()>[]>*,&。
對于int *(*p(int))[3]; 。我是這么分析的:
int *(*p(int))[3]=>int *p1[3]:等價于 int *p1[3]
1、表示取p1里的某個元素是int指針,那么p1是一個數(shù)組,里面的東西全部是指針
p1=>*p2,p2=>p(int)
2、表示取了p2的值才是p1,顯然p2也是指針(指向數(shù)組的指針);p2等效于一個函數(shù)調(diào)用,那么p一個函數(shù)
整個表達(dá)式相當(dāng)于一個函數(shù)聲明,返回值是指針,指向的是數(shù)組,數(shù)組的乘員又是指針。編譯之后不會產(chǎn)生任何代碼。如果要寫fuck brain的代碼可以用這種方式寫函數(shù)聲明頭文件,把別人繞暈。
這里要特別注意返回的是指針,所以符合語法規(guī)則。如果把這個函數(shù)的返回值typedef成一個類型,那么就較容易理解了。
如果要寫這種繞腦的代碼,最好typedef一下:typedef int* (*int_array_ptr)[3];。
下面是隨便寫的一段代碼,驗證一下這個問題。
typedef int* (*int_array_ptr)[3];//這里必須要指定長度,sizeof(int_array_ptr)才知道長度
typedef int* int_array [];
typedef int* (*func_ptr)(int);
typedef int func_type(int);
int* TestFunc(int a)
{
printf("TestFunc
");
return 0;
}
int** TestFunc2(int a)
{
printf("TestFunc2
");
return NULL;
}
int func2(int a)
{
printf("func2
");
return NULL;
}
int main()
{
int *(*ps1(int))[3];
int *(*(ps2(int)))[3];
int a = 1;
int *b = &a;
int *c = &*b;
int d = *&a;
printf("a=%d
", a);
printf("*b=%d
", *b);
printf("*c=%d
", *c);
printf("d=%d
", d);
//int **(ps3(int))[3];
//int ** ps4(int)[3];
int_array_ptr ps5(int);//函數(shù)聲明
//int *((*ps)(int))[3];
//int* (*p)(int)[3];
func_ptr func[3];//數(shù)組聲明,數(shù)組的成員是函數(shù)指針
func_type func2;//函數(shù)聲明
int size = sizeof(func_type*);
int size = sizeof(func_type);//語法錯誤,對一個函數(shù)使用sizeof不成立
func2(3);//只有有實現(xiàn)的函數(shù)才能調(diào)用,如果把func2的實現(xiàn)刪除,編譯會報找不到符號
//printf("ps1=%X
", &ps1);//函數(shù)沒有實現(xiàn),所以ps1不存在,編譯報找不到符號
//printf("ps2=%X
", &ps2);//
printf("funcptr=%X
", func);
printf("funcarrayptr=%X
", &func);
printf("func2ptr=%X
", &func2);
//memcpy(&func2,&TestFunc2,4);//不能修改代碼段的數(shù)據(jù),執(zhí)行報錯,&func2指向程序代碼段中的地址,
//一個程序平坦的內(nèi)存被劃分為代碼段、數(shù)據(jù)段
//p = func[0];
return 0;
}
總結(jié)
以上是生活随笔為你收集整理的c语言巩固,巩固一下C语言中的指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三维图形几何变换算法实验_计算机视觉方向
- 下一篇: java tomcat重启linux_L