第一组练习
#include <stdio.h>
#include <stdlib.h>
int main()
{
int cnt;
printf("请输入数组的个数(>0):\n");
scanf("%d", &cnt);
if (cnt<=0) return 0;
int (* const p)[5]=malloc(cnt*4*5); //p是指向int[5]的指针
//由于已经分配了空间, 这时可以看作二维数组了
//区别1: 这个伪二维数组在堆上, 真数组在栈上
//区别2: p是指针变量, 在栈内占用4个字节, 有自己的地址
//区别3: &p得到的是指针变量的地址, 所以&p!=p, 真数组&运算是相等的
int i;
for (i=0; i<cnt; i++){
printf("请输入%d号数组的5个成员:\n", i); //以下三行写法等价
scanf("%d%d%d%d%d", *(p+i), *(p+i)+1, *(p+i)+2, *(p+i)+3, *(p+i)+4);
//scanf("%d%d%d%d%d", p[i], p[i]+1, p[i]+2, p[i]+3, p[i]+4);
//scanf("%d%d%d%d%d", &p[i][0], &p[i][1], &p[i][2], &p[i][3], &p[i][4]);
}
for (i=0; i<cnt; i++){
printf("%d号数组的5个成员: ", i);
printf("%d %d %d %d %d\n", p[i][0], p[i][1], p[i][2], p[i][3], p[i][4]);
}
free(p);
system("pause");
return 0;
}
第二组练习
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *s1;
int * i2;
void * const p=malloc(8);
s1=p;
i2=p;
if (s1==i2) //指针比较时, 只比较地址, 不比较类型
puts("s1,i2相等");
if (s1==p)
puts("s1,p相等");
//变量是"特定内存中的数据"
//可以通过指针的解引用来读/写
s1[0]='a'; s1[1]='b';
s1[2]='c'; s1[3]='\0';
puts(p);
i2[1]=321;
printf("%d %d\n", *i2, *(i2+1));
free(p);
system("pause");
//数组在堆还是栈中?
int *i3=malloc(4*4); //int i3[4]=malloc(4*4); 编译失败
int i4[4];
printf("i3..%p\ni4..%p\n", i3, i4);
//free(i3); //如果这里释放i3, 下面的c3将会与i3相等
char *c3=malloc(4);
char c4[4]="abc";
printf("c3..%p\nc4..%p\n", c3, c4);
free(c3);
free(i3);
system("pause");
return 0;
}