C语言第11篇

1.

#include<stdio.h>

int main()

{

    int a[5] = { 1, 2, 3, 4, 5 };

    printf("%d\n",a);

    printf("%d\n",&a);

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

    printf("%d\n",a+1);

    //printf("%d\n",&(a+1));此处不可加取地址符

    printf("%d\n",*(a+1));

    printf("%d\n",&a+1);

    return 0;

}

//假设a的地址为1000;

那么请写出运行结果

提示:

注意换行

在数组和指针中,指针类型决定了指针的步长(向前 / 向后 走一步多大距离)

char* 指针 + 1,意思是跳过一个字符,也就是向后走1个字节

short* 指针 + 1,向后走2个字节

int* 指针 + 1,意思是跳过1个整形,也就是向后走4个字节

double* 指针 + 1,意思是跳过一个double,也就是向后走8个字节

那么(&a+1)是什么呢

其中,a是数组名,那我们就知道,在数组名前加取地址符,表示整个数组的地址。

而&a+1表示的地址,则是跨过整个数组的第一个地址。

在这题中a的地址为1000;

那么&a+1跨越了整个数组,地址就加了4*5个,也就是1020

2.

#include<stdio.h>

int main()

{

   int a[5] = { 1, 2, 3, 4, 5 };

   int* ptr = (int*)(&a + 1);

   printf("%d,%d", *(a + 1), *(ptr - 1));

   return 0;

}

请写出运行结果

3.

#include <stdio.h>

int main()

{

   int a[3][2] = { (0, 1), (2, 3), (4, 5) };

   int* p;

   p = a[0];

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

   return 0;

}

请写出运行结果

提示:建议复习指针的赋值

此题与逗号运算符有关

4.编程题

答案:

1.

1000

1000

1

1004

2

1020

2.解析:

Int类型的指针ptr在定义的时候,它的地址已经把a数组的范围超越了(越界了),它指向5后面内存的东西

*(ptr-1)就指向了5,

*(a+1)为a数组的第二个值

所以答案为:

2,5

3,

解析:数组赋值的话是一个大括号,里面写发看下图

所以这里一个括号是一个数,里面是逗号运算符

(0,1)就是1,(2,3)就是3

答案为:

1

4.我们常在定义最大值和最小值时就给赋值0或者数组的第一个

易懂版:

#include<stdio.h>
int main(){
    int a[3][3];
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            int x;
            scanf("%d",&x);
            a[i][j]=x;
        }
    }
    int z=0;//主对角线的和
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(i==j){
                z+=a[i][j];
            }
        }
    }
    int f=0;//副对角线的和
    for(int i=0;i<3;i++){//副对角线的下标为02,11,20
        for(int j=0;j<3;j++){
            if(i+j==2){
                f+=a[i][j];
            }
        }
    }
    printf("%d\n%d\n",z,f);
    return 0;
}

简易版:

#include<stdio.h>
int main(){
    int a[3][3];
    int z=0;//主对角线的和
    int f=0;//副对角线的和
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(i==j)z+=a[i][j];
            if(i+j==2)f+=a[i][j];
        }
    }
    printf("%d %d\n",z,f);
    return 0;
}

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值