指针 study~O(∩_∩)O~

数组名与指针变量区别:

数组名相当于指针常量,不能被修改;指针变量可以被改变。

指针在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 }

 

posted @ 2012-10-15 12:10  测开刘小洋  阅读(164)  评论(0编辑  收藏  举报