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;
}