数组名与指针变量区别:
数组名相当于指针常量,不能被修改;指针变量可以被改变。
指针在32位操作系统上占4个字节。
以下代码可正常运行:
1 #include<stdio.h> 2 int main() 3 { 4 int a[] = {1,2,3,4,5}, i , *pa; 5 pa = a; 6 for(i=0 ; i<5 ; i++) 7 { 8 printf("%d ",*(pa+i)); 9 printf("%d\n",*(a+i)); 10 printf("%d ",pa[i]); 11 printf("%d\n",a[i]); 12 } 13 return 0; 14 }
以下代码11行出错,因为a是指针常量,出现编译错误:
1 #include<stdio.h> 2 int main() 3 { 4 int *pa, i , a[]={1,2,3,4,5}; 5 pa = a; 6 for(i=0 ; i<5 ; i++) 7 { 8 printf("%d\n",pa); 9 pa++; 10 printf("%d\n",a); 11 a++; //编译时错误,a相当于指针常量 12 } 13 return 0; 14 }
const int p:常量,不能在程序其他地方更改p值
const int p = 20; p = 10; //错误,编译无法通过
const int *p:指向常量的指针,p是指针变量,指向的值是常量,程序其他地方不能更改*p值
int const *p:同上
int i = 10; int j = 20; const int *p = &i; p = &j; //可以在任何时候给p赋予新值 *p = 80; //错误,*p是 常量,不能被赋值 j = 80; //但是可以通过改变变量j的值来改变*p的值
int * const p:指向变量的常量指针,程序其他地方不能更改p的值,但是可以更改*p的值
int i = 10; int j = 20; int * const p = &i; p = &j; //错误,p是指针常量,初始化以后便不能再更改 *p = 80; //正确,*p是int型变量,是可以被更改的
int *pi指针指向const int i常量的情况
const int i = 10; int *pi; pi = &i; //错误,编译错误,但是可以用强制转换类型 pi = (int *)&i; //但是仍然不能通过*pi修改i的值 *pi = 20; printf("%d\n",i); //i的值由编译器决定吧,试了几次结果是不一样的,vc++6.0、vs、gcc //反汇编出来的结果也是不一样的。 printf("%d\n",*pi);
查询网上有人如是说,至于对不对我也不知道呀:
存储位置:对于一个const类型的局部变量,真的是分配在“只读数据段”?还是和普通局部变量一样在栈上分配内存?
只读数据段仅是实现的其中一种方式,目的是在运行时令试图修改const变量的行为产生错误。由于C标准并没有禁止对const变量的修改,而是规定属于未定义行为,因此一个实现对于试图修改const的行为如何处理都没有违反标准,也就是说,无论把const变量放在只读段也好,放在可被修改的地方也好(例如你说的栈),都是允许的行为。
通过函数指针调用函数:
1 #include<stdio.h> 2 3 void MyFunc(int x); 4 void (*PMyFunc)(int x); 5 6 int main(int argc , char *argv[]) 7 { 8 PMyFunc = MyFunc; //对的 9 PMyFunc = &MyFunc; //对的 10 MyFunc(10); //对的 11 (*MyFunc)(10); //对的 12 PMyFunc(10); //对的 13 (*PMyFunc)(10); //对的 14 return 0; 15 } 16 17 void MyFunc(int x) 18 { 19 printf("hello\n"); 20 }
MyFunc的函数名与PMyFunc函数指针都是一样的,都是函数指针。MyFunc函数名相当于函数指针常量,PMyFunc是一个函数指针变量。
函数指针作为某个函数的参数:
1 #include<stdio.h> 2 3 typedef void (*FuncType)(int x); //FunType定义了这样一种返回值为void类型,参数为int类型的函数指针 4 void Func1(int x); 5 void Func2(int x); 6 void Func3(int x); 7 void CallFunc(FuncType func , int x); 8 9 int main(int argc , char *argv[]) 10 { 11 CallFunc(Func1,10); 12 CallFunc(Func2,20); 13 CallFunc(Func3,30); 14 return 0; 15 } 16 17 void CallFunc(FuncType func , int x) 18 { 19 func(x); 20 } 21 22 void Func1(int x) 23 { 24 printf("i am func1 %d\n",x); 25 } 26 27 void Func2(int x) 28 { 29 printf("i am func2 %d\n",x); 30 } 31 32 void Func3(int x) 33 { 34 printf("i am func3 %d\n",x); 35 }