一维指针和一维数组可以等同。 但是二维指针和二维数组不能等同 不能直接p=a
因为在取p[i][j]的时候
会这样做 *(*(p+i) + j)
这样先将p偏移i个单元,取值, 取到的是数组a里面的某个值,而不是一个地址。
这个代码 最简单的改法,不是你注释里面的改法,而是
#include<stdio.h>#include <stdlib.h>
void main()
{
int **p,a[3][3]
int i,j
p=(int **)malloc(3*sizeof(int*))//这里用sizeof(int*)而不是int
for (i=0i<3i++)
p[i]=a[i]//将每行的首地址赋值给动态数组p的一个元素。
for (i=0i<3i++)
for (j=0j<3j++)
{p[i][j]=i+j
printf("%d",p[i][j])}
}
首先,程序有一个问题,main函数未返回,应在最后一行添加"return 0"
言归正传,"学号"的类型是int,意味着可以是8,10,16进制,十进制没有什么特征,但有一个规范,16进制以0x开头,8进制以0开头,所以:
0010是八进制10,也就是十进制8,
0023是八进制23,也就是十进制19
0020是八进制20,也就是十进制16,
"1"开头就不会有问题,但改成"01"就变成八进制,
如果非想用0开头,把num改为字符数组类型,0010,0023,0020放引号里
#include <stdio.h>#define M 100
void arrout (int * ,int)
int arrin (int *)
void main()
{
int s[M],k
k=arrin (s)
arrout(s,k)
}
int arrin (int *a)
{
int i,x
i=0
scanf("%d,&x")
while (x>0)
{
*(a+i)=x
i++
scanf("%d",&x)
}
return i
}
void arrout (int *a,int n)
{
int i
for(i=0i<ni++)
printf(((i+1)%5==0)? "%4d\n":"%4d",*(a+i))//?条件语句写有一些问题
printf("\n")
}
错误有两处,修改一下编译通过~
1 条件语句写有一些问题
2 main函数默认有返回值