poj2105---用指针对数组分块操作


#include <stdio.h>
#include <stdlib.h>
int count=1;
int pow1(int a,int b)
{
    int pro=1,i;
    if(b==0)
        return 1;
    for(i=0;i<b;i++)
    {
        pro*=a;
    }
    return pro;
}
void trans(int *p1)//每次传进一个地址,调用一次这个函数,就算出这一块的10进制值,并直接输出
{
    int sum=0,i;
    p1--;
    for(i=0;i<8;i++)//sum=0,在第一次就已经获取了最右位的值
    //注意i从0开始,不仅在次数上,与从右向左2的指数从0开始
    //总结:这种8位一块的不易去判断数组的访问会不会出错,就用简单的例子去找规律
    {
        sum += *p1 * pow1(2,i);
        p1--;
    }//当循环出去的时候,p1实际上指向了这一块的前一个元素
    printf("%d",sum);
    //不是所有数后面都加点
    if(count++ <4)
        printf(".");
}

int main()
{
    int arr[32],n,i;
    char arr1[33];
    scanf("%d",&n);
    while(n--)
    {
        count=1;
        scanf("%s",arr1);
        for(i=0;i<32;i++)//对于输入,不可能将大数直接存进一个数,即使刚好能存进,也不便访问,所以用字符串先存
        {                           //再转换为int数组里的每一个元素
            arr[i]=arr1[i]-'0';
        }
        for(i=1;i<=4;i++)
            trans(arr+i*8);//arr+i*8这个是表示数组元素地址的常用形式
        printf("
");
    }
    return 0;
}

题意:一个32位的串被分成4部分,每部分8位,将这8位二进制转换为十进制,就要转换4次

arr+8*1指向第二块的首元素,如果是4块,最后一次指针应该指向没有的第五块首元素地址

原文地址:https://www.cnblogs.com/gabygoole/p/4538232.html