C指针与数组

  • 通过指针遍历数组的小把戏
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
void main()
{
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    for (int *p = a; p <= a + 9; p++)
    {
        printf("值是%d,地址是%p\n",*p,p);
    }
    getchar();
}

 

  •  a代表指向整型数组首元素地址的指针,被称作指向整型类型的常量指针,原因见下属上机实验结果,而p相对而言就是变量指针,可以把数组a[10]的首地址a赋值给p

 

 左值,处于赋值号左边可以被赋值的变量,实验结果是提示左值不可赋值

  • 也可以巧妙安排借助指针改变地址中存放的值
void main()
{
    int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    time_t st;
    srand((unsigned int)time(&st));
    //利用指针替换数组a
    int *p = a;
    for (int i = 0; i < 10; i++)
    {
        *p = rand()%100;//指针当前位置的元素改为以时间为种子生成的随机数
        p++;//指针向前推进,遍历到数组的下一个元素
    }
    for (int *p = a; p < a + 10;p++)
    {
        printf("当前元素是%d,地址是:%p\n",*p,p);
    }
    system("pause");
}

输出结果:

 

 

  •  也可以利用指针运算性质,不断的推进地址,达到访问地址中存放的值的效果
void main()
{
    time_t ts;//声明了一个时间
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    srand((unsigned int)time(&ts));//以时间为种子生成随机数,如果省略此行代码,则下一行代码生成的总是一个数
    printf("此刻,生成的随机数是%d\n", rand() % 100);//生成0-99----对100取余,肯定数字小于100
    int i = 0;
    int num[10];
    for (int *p = num; p < num + 10;p++)
    {
        num[i] = rand() % 100;
        i++;
    }
    int *q = num;//这里用到了num是数组首元素地址的特性q+i=&num[i]  *(q+i)=num[i]
    for (int i = 0; i < 10; i++)
    {
        printf("q[i]=%d, *(q+i)=%d\n",q[i],*(q+i));
    }
    getchar();
}

  •  求随机数组的最大值及其下标
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
    time_t st;
    srand((unsigned int)time(&st));
    int crazyarray[10];
    for (int i = 0; i < 10; i++)
    {
        crazyarray[i] = rand() % 100;
    }
    int *p = crazyarray;
    int max = *p;
    int index = 0;
    for (int *q = crazyarray; q < crazyarray + 10; q++)
    {
        printf("%d\n", *q);
        if (*q>max)
        {
            max = *q;
            index= q - p;
        }
    }
    printf("最大值是%d,下标是%d\n",max,index);
    getchar();
}

输出结果:

 

posted @ 2019-11-28 20:21  saintdingtheGreat  阅读(127)  评论(0编辑  收藏  举报