【指针】-1

指针

认识指针

这里写图片描述

声明一个名为i_pointer的指针 将变量i的地址取出来,赋值给i_pointer指针

两个指针操作符

这里写图片描述

将i取地址赋值飞pointer指针,然后再打印pointer指针。值为2000

指针与指针变量

这里写图片描述

可以把“指针”想成指针变量的索引(地址),而指针变量跟int i 中的变量一样

定义一个指针变量

这里写图片描述

将pointer_2中储存变量j的地址赋值给pointer_1,然后pointer_1得到变量j的地址,从而指向变量 j
注意:不要将整数或者其他非地址类型的数据赋值给指针变量,否则编译器会把它当做地址处理

代码分析1

int main()
{
    int a, b;
    int *p1, *p2;
    a = 100; b = 10;

    p1 = &a;
    p2 = &b;

    printf("%d,%d\n",a,b);
    printf("%d,%d\n", *p1, *p2);
}

result:
100,10
100,10
请按任意键继续. . .

int类型的变量a和变量b以及变量指针,ok;
将变量a的地址赋值给p1,将变量b的地址赋值给p2,ok;
打印变量a和变量b的值;是取值操作符,p1本指向a,然后就是将a的值取出来了,,p2本指向b,然后就是将b的值取出来,ok.相当于通过&获得地址,然后用 将所指变量的值取出来。ok

代码分析2

输入两个整数,从一大一小排列(指针)

int main()
{
    int a, b;
    int *p1,*p2,*p;
    scanf("%d %d", &a, &b);
    p1 = &a;//p1指向a
    p2 = &b;//p2指向b

    if (a < b)
    {
        p = p1;
        p1 = p2;
        p2 = p;
    }//每人只能持有一张门牌号否则会遭天谴,3个人ABC,其中2个人想交换门牌号。A现将门牌号给C,B再将门牌号给A,C再将门牌号给A

    printf("%d,%d\n",a,b);
    printf("%d,%d\n", *p1, *p2);
}

result:
5 6
5,6
5,6
请按任意键继续. . .

代码分析3

输入三个整数,从一大一小排列(指针)

int main()
{
    void exchange(int *q1, int *q2, int *q3);
    int a,b,c;
    int *p1,*p2,*p3;
    scanf("%d %d %d", &a, &b,&c);
    p1 = &a;
    p2 = &b;
    p3 = &c;

    exchange(p1, p2, p3);

    printf("%d,%d,%d\n",a,b,c);
    printf("%d,%d,%d\n", *p1, *p2,*p3);

}
void exchange(int *q1, int *q2, int *q3) 
{
    void swap(int *pt1, int *pt2);

        if (*q1 < *q2)
        {
            swap(q1, q2);
        }
        if (*q1 < *q3)
        {
            swap(q1, q3);

        }
        if (*q2 < *q3)
        {
            swap(q2, q3);
        }

}

void swap(int *pt1, int *pt2)
{
    int temp;
    temp = *pt1;
    *pt1 = *pt2;
    *pt2 = temp;
    printf("%d,%d\n", *pt1, *pt2);
}

result:
1 5 99
5,1
99,5
5,1
99,5,1
99,5,1
请按任意键继续. . .

指针与数组

这里写图片描述
这里写图片描述

常见的一个错误

int main()
{
    int *p, i, a[10];
    p = a;
    for (i = 0; i < 10; i++)
    {
        scanf("%d", p++);
    }
    printf("\n");

    for (i = 0; i < 10; i++, p++)
    {
        printf("%d", *p);
    }

}

result:
1 2 3 4 5 6 7 8 9 0

-858993460-8589934602-858993460-8589934608191008-8589934602056059704819104020847438请按任意键继续. . .

实战演练

如何将一个数组a的整数按相反顺序排列

Version-1:数组名作为参数

void reverse(int x[], int n);

int main()
{
    int i, a[10] = { 3,7,9,11,0,6,7,5,4,2 };//形参为数组名
    printf("The original array:\n");
    for (i = 0; i < 10; i++)
    {
        printf("%d ",a[i]);
    }
    reverse(a, 10);
    printf("\n");
    printf("The array hsa been inverted:\n");
    for (i = 0; i < 10; i++)
    {
        printf("%d ", a[i]);
    }
}
void reverse(int x[], int n)
{
    int tmp, i, j,m;
    m = (n - 1) / 2;
    for (i = 0; i <= m; i++)
    {
        j = n - 1 - i;//j为i对应的元素
        tmp = x[i];
        x[i] = x[j];
        x[j] = tmp;
        //看来在函数内形参作为变量名
    }
}

result:
The original array:
3 7 9 11 0 6 7 5 4 2
The array hsa been inverted:
2 4 5 7 6 0 11 9 7 3 请按任意键继续. . .

Version-2:指针作为参数

void reverse(int *x, int n);

int main()
{
    int i, a[10] = { 3,7,9,11,0,6,7,5,4,2 };
    printf("The original array:\n");
    for (i = 0; i < 10; i++)
    {
        printf("%d ",a[i]);
    }
    reverse(a, 10);
    printf("\n");
    printf("The array hsa been inverted:\n");
    for (i = 0; i < 10; i++)
    {
        printf("%d ", a[i]);

    }

}


void reverse(int *x, int n)
{
    int *p, tmp, *i, *j, m;

    m = (n - 1) / 2;
    i = x;//下标为0的第一个元素
    j = n - 1 + x;//下标为n-1的最后一个元素
    p = x + m;
    printf("\n%d", *p);
    //why p 和*p不一样????????????????
    for (; i <= p;i++,j--)
    {
        tmp = *i;
        *i = *j;
        *j = tmp;
        //printf("%d %d \n", *i,*j);
    }
}

实战演练3

对数组中的10个整数进行从大到小的排序

void sort(int x[], int n);

int main()
{
    int *p,i, a[10] = { 3,7,9,11,0,6,7,5,4,2 };
    printf("The original array:\n");
    for (i = 0; i < 10; i++)
    {
        printf("%d ",a[i]);
    }
    p = a;
    sort(p, 10);
    printf("\n");
    printf("The result is :\n");
    for (p=a,i = 0; i < 10; i++)
    {
        printf("%d ", *p);
        p++;
    }
    printf("\n");
}

void sort(int x[], int n)
{
    int i, j,tmp;
    for (i = 0; i < n - 1; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            if (x[i] < x[j])
            {
                tmp = x[i];
                x[i] = x[j];
                x[j] = tmp;
            }
        }
    }   
}

result:
The original array:
3 7 9 11 0 6 7 5 4 2
The result is :
11 9 7 7 6 5 4 3 2 0
请按任意键继续. . .
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值