c - 二级指针与地址问题
本文介绍了c - 二级指针与地址问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
各位老哥,昨天上机有道题百思不得其解,在此诚恳的发文,希望有朋友们多多指教,我已经快疯了.
问题描述如下,如有描述不清楚的地方,欢迎评论指出.
如下结构体:
typedef struct student
{
int age;
int height;
}stu;
typedef struct school
{
int num;
stu **boys;
}grade;
我的目的是让结构体grade(班级)中包含学生的个数与指向学生结构体的二级指针。(当然有更好的实现比如柔性数组,我们就讨论这个二级指针的形式)
做如下操作.
假设有结构体
stu *tmp = NULL;
grade oneclass;
//定义班级男生个数
oneclass.num = 55;
grade *one=&oneclass;
声明了结构体grade和指向结构体grade的指针.
然后我去申请一片内存
//申请内存
tmp = malloc(oneclass.num*sizeof(stu));
one->boys = &tmp;
那么问题来了:
如何通过多种方法访问申请的内存块.
最后附上我写的源码,方便各位老哥调试程序:
#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
int age;
int height;
}stu;
typedef struct school
{
int num;
stu **boys;
}grade;
int main()
{
stu *tmp = NULL;
grade oneclass;
//定义班级男生个数
oneclass.num = 55;
grade *one=&oneclass;
//申请内存
tmp = malloc(oneclass.num*sizeof(stu));
one->boys = &tmp;
//如何通过tmp 和结构体指中boyes指针来操作 申请的内存,请打印第一个 第二个 第N个元素地址(两种方式打印)
return 0;
}
解决方案
int i = 0;
for (i=0; i<55; i++)
{
printf("%p %p %p\n", tmp+i, &tmp[i], *one->boys+i);
}
这样子打印出来的3个值是一样的。
而且,tmp[1]
并没有指向55*8之后。
for (i=0; i<55; i++)
{
tmp[i].age = i;
}
for (i=0; i<55; i++)
{
printf("%d ", (*one->boys)[i].age);
}
// 输出:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
这篇关于c - 二级指针与地址问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文