06_指针

 

 

 

 

一、导入:

指针是C语言里最强大的特性之一,当然它也是最容易让我们困惑的,所以尽量在开始时就正确的理解其概念.

 

二、指针的定义

 可以存储地址的变量称为指针(pointers);

类型 *指针变量名

int  *  pj;

char  *s;

float  *var;

 

 

 

三、指针的初始化

int i;

int *pi=&i; //&是取变量地址的符号 之前的scanf里用到过

 

 

 

四、通过指针访问值

int i=123321;

int *pi=&i;  //实际上int*是类型  pi是指针变量名

printf("%d,%d\n",i,*pi);

 

int  *pi

 

int*  pi

int  *  pi

 

以上三种写法等价

 实例:

#include <stdio.h>
#include <string.h>
int main(void)
{
    int i[2]={100,200};

    int *p=&i;
    printf("%x, %d\n",p, *p);

    p=(int*)((int)p+sizeof(int));

    printf("%d,%d",i[0],*p);


    getchar();
    return 0;
}
View Code
95f8fc, 100
100,200
View Code

 

五、指针的命名

  以后我们编写的代码越来越大,很难分清那个是变量,那个是指针,因此我们最好将p作为指针名的第一个字母。这样我们便于区别那个是变量,那个是字母。

 

 

六、指针的运算

1、++运算

2、--运算

3、+运算

4、-运算

    

#include <stdio.h>
#include <string.h>
int main(void)
{
    int  *pj;

    pj=(int*)10;
    printf("pj=%d, *pj=%d\n",pj, sizeof(pj) );
    pj=pj-2;//10-4*2

    printf("%d\n",pj ); // sizeof(double)

    getchar();
    return 0;
}
View Code
pj=10, *pj=4
2
View Code

 

七、用指针访问数组

  

#include <stdio.h>
#include <string.h>
int main(void)
{
    int i;
    int ai[11]={0,11,12,13,14,5,6,7,8,9,10};//12ff3c
    int* pi=&ai[10] ;
    for (i=0;i<11;i++)
    {
        printf("%#x,%d \n",pi,*pi--);
    }

    getchar();
    return 0;
}
View Code
0xdefd48,10
0xdefd44,9
0xdefd40,8
0xdefd3c,7
0xdefd38,6
0xdefd34,5
0xdefd30,14
0xdefd2c,13
0xdefd28,12
0xdefd24,11
0xdefd20,0
View Code

 

八、指向常量的指针

  定义形式: const 类型 * 指针名;

  不能通过指针修改地址里的值。

     int i=0x123;       

         const int *p=&i; 

         *p=0; //错误

//前置const 指针

 

 九、  常量指针

  定义形式: 类型* const 指针名;

后置const不能改变地址

     int i=0x123;

         int j=0x456;

         int * const p=&i;

         *p=0; //正确

          p=&j; //错误

//后置const指针

 

小结:

前置const不能通过指针改变地址内的值 (在*号前) *p=???;

后置const不能改变地址,也就是不能从新给指针赋值(在*号后) p=???;

 

#include <stdio.h>
#include <string.h>
int main(void)
{
    
    // const int *p=(int*)1;     
    ////*p=0; //错误
    // p=(int*)0x333;


    // int i=100;
    // int j=200;
    // int const *p=&i;     
    //*p=0; //错误
    // i=0;
    // p=&j;
     

    int i=0x123;
    int j=0x456;
    int  * const      p=&i;
    *p=0; //正确
    // p=&j; //错误
      

    getchar();

    return 0;
}
View Code

 

十、  用指针访问一维数组        

 

#include <stdio.h>
#include <string.h>
int main(void)
{
    //代码

    int i=0;

    int a[2]={11,22};

    int *p=&a; //int *p=&a[0];

    printf("%d\n",*p);

    p++;

    printf("%d",*p); 

    /*代码

    int i=0;

    int a[2]={11,22};

    int *p=&a; //int *p=&a[0];

    for(i=0;i<2;i++,p++)

    {

        printf("%d\n",*p);

    }     

    代码

    int i=0;

    int a[2]={11,22};

    int *p=&a; //int *p=&a[0];

    for(i=0;i<2;i++)

    {

        printf("%d\n",p[i]);

    } */     
    getchar();
    return 0;
}
View Code

 

 二、  用指针访问二维数组               

       

 

三、  用指针访问三维数组        

        

#include <stdio.h>
#include <string.h>

int main(void)
{
    int a[2][3][4]={
        {{ 1, 2 ,3 ,4}   ,  {5, 6, 7, 8}  ,{ 9,10,11,12}},
        {{13,14,15,16}   ,  {17,18,19,20} ,{21,22,23,24}}
    };
    //int (*p)[3][4]=(void*)0x12ff04;//0x12ff04
    int (*p)[3][4]=a;
    int i,j,k;
    printf("%#x\n",&a);



    for (i=0;i<2;i++)

    { 

        for (j=0;j<3;j++)

        {

            printf("{");

            for (k=0;k<4;k++)

            {

                printf("%d,",p[i][j][k]);

            }

            printf("},");

        }

        printf("\n");

    }

    getchar();



    return 0;

}
View Code
0xcffb90
{1,2,3,4,},{5,6,7,8,},{9,10,11,12,},
{13,14,15,16,},{17,18,19,20,},{21,22,23,24,},
View Code

 

小结:

  访问 int  a[x][y][z][i][j]的指针 定义为 int  (*p)[y][z][i][j]

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-05-20 21:41  岁月荏苒¥我心依旧  阅读(124)  评论(0编辑  收藏  举报