指针一些理解

说一下指针的基本用法,(主要是给自己写的,不一定符合大家的胃口欧)

一、指针易错

下面是需要注意的。

 在使用已定义好的指针变量时,在变量名前面不能加 *。例如:

  1. int *p,a;
  2. *p=&a; //错误,指针变量是p而不是*p

而如下语句是正确的。

  1. int a,*p=&a; //正确

该语句貌似把 &a 赋给了 *p,而实际上 p 前的 * 仅是定义指针变量 p 的标识,仍然是把 &a 赋给了 p,故是正确的赋值语句。

 

 

二、指针与一维数组

指针

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void paixu(int *p,int n)
{
    int *i,*j,t;
    i=p;j=p+n-1;
    for(;i<=j;i++,j--)
    {
        t=*i;
        *i=*j;
        *j=t;
    }
}
int main()
{
    int n,*q1,*q2;
    scanf("%d",&n);
     q1=q2=(int *)malloc(n*sizeof(int));
    for(int i=0;i<n;i++)
    {
        scanf("%d",q1);
        q1++;
    }
    paixu(q2,n);
    for(int i=0;i<n;i++)
    {printf("%d ",*q2);q2++;}
}

  三、指针与字符串

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void paixu(char **p,int n)
{
    char a[100];
     for(int i=0;i<n-1;i++)
     {
         for(int j=i+1;j<n;j++)
         {
             int l=strcmp(p[i],p[j]);
             if(l>0)
             {
                 strcpy(a,p[i]);
                  strcpy(p[i],p[j]);
                   strcpy(p[j],a);
             }
         }
     }
}
int main()
{
    int i,n;
    char t[100],*p[20];
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%s",t);
        int l=strlen(t);
        p[i]=(char *)malloc((l+1));
        strcpy(p[i],t);
    }
    paixu(p,n);
    for(i=0;i<n;i++)
    {
        printf("%s",p[i]);
        printf("\n");
    }
}

  四、(1)指针和二维数组

               

 

 

 

               初步来理解指针和二维数组,就拿a【3】【4】和指针来举例子,就如上表列出来的。分为行指针和列指针。行指针可以通过取星来换成列指针,比如,a表示第0行的首地址,*(a)=*(a+0)+0=a【0】表示第零行第〇列的地址。

因此我们可以将二维数组换成指针来表示。比如,a【1】【2】的地址就可以用*(a+1)+2来表示,然后如果是表示元素再在前面取星就行啦。

举个例子:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
    int (*p)[4]=a;//定义一个数组指针是指向含 N 个元素的一维数组的指针
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<4;j++)
        {
            printf("%d ",*(*(p+i)+j));
        }
        printf("\n");
    }
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int n,i,j;
    float (*q1)[3],*q2;
    scanf("%d",&n);
    q1=(float(*)[3])malloc(n*3*sizeof(float));
    q2=q1[0];//将q1的首行首列给q2,
    for(i=0;i<n;i++)
    {
        for(j=0;j<3;j++)
        {
            scanf("%f",*(q1+i)+j);
        }
    }
    for(i=0;i<n*3;i++,q2++)
    {
        printf("%f",*q2);

    }
    return 0;
}

 

posted @ 2020-04-07 21:07  剑枫  阅读(250)  评论(0编辑  收藏  举报