zoukankan      html  css  js  c++  java
  • 指针 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 }
  • 相关阅读:
    二叉树遍历
    NO.35 2021/12/13(06:50)[周一]
    NO.29 2021/11/30(06:30)[周二]
    NO.22 2021/11/19(06:15) [周五]
    The .NET ORM Architec
    C#格式字符串
    C# Attribute
    .net DLL反编译文件
    【Beta】Scrum meeting1
    【Alpha】Scrum meeting 6
  • 原文地址:https://www.cnblogs.com/binger1990/p/2724082.html
Copyright © 2011-2022 走看看