int main()
{
char *p[]={"dasa","dasdd","dxzczxc","cfdasg"};
for(int i=0;i<4;i++)
printf("address:%d\n",*(p+i));
}
为什么不是连续的呀 ,是我的表达式有错吗?指向 指针数组中 的 元素(指针)纠结了呀。
指针数组的地址是什么排序的
答案:5 悬赏:60 手机版
解决时间 2021-04-04 12:56
- 提问者网友:伴风望海
- 2021-04-04 08:06
最佳答案
- 五星知识达人网友:佘樂
- 2020-04-23 16:13
常量区分配的确实也不知道怎么分配的
但是如果是
char p[][10]={"dasa","dasdd","dxzczxc","cfdasg"};
这样定义的话那么就是连续的
但是如果是
char p[][10]={"dasa","dasdd","dxzczxc","cfdasg"};
这样定义的话那么就是连续的
全部回答
- 1楼网友:大漠
- 2019-11-02 21:37
常量字符串,通常存放在text段,或者代码段,具体是否连续存放,跟对应的编译器有关。
- 2楼网友:鱼忧
- 2020-03-10 00:07
#include
#include
#include
#include
#define len sizeof(struct student)
#define assert(p) if((p)==null) {printf("指针错误!退出...\n");exit(-1);}
//定义学生成绩结构。除了后五项成绩及rank,next外,其余项都可不要。
typedef struct student
{
int num; //学号
char name[20]; //姓名
char sex; //性别
int age; //年龄
char major[50]; //专业
char class[8]; //班级
float score1; //成绩1
float score2; //成绩2
float score3; //成绩3
float score4; //成绩4
float score5; //成绩5
int listno; //原始编号
int rank; //排序后的编号(最高分者编号为1,依次递增)
struct student * next; //链表的下一个结点指针
} node, *pnode;
int compsturec2(const void *s1, const void *s2);//qsort的回调比较函数
int main(int argc, char *argv[])
{
if (argc<2)
{
printf("命令格式:\n%s 文件名\n", argv[0]);//由命令行输入文件名
return -1;
}
//打开文件及定义变量
file *fp;
fp=fopen(argv[1],"r");
if(fp==null)
{
printf("文件打开错!\n");
return -2;
}
int i=0, j, n=0, items; //n保存记录条数
char line[150];
float x[5];//保存从文件中读来的一行中的各个成绩的
pnode head=null, tail=null, p;
//读取文件中的记录,建立链表
rewind(fp);
do
{
memset(line, 0, sizeof(line)); //避免上次的内容影响本次循环,先将line字符串清空
fgets(line,sizeof(line), fp); //从文件中读取一行记录
j=strlen(line)-1;
while(isspace(line[j])) //防止空白字符行
line[j--] = '\0';
if(strlen(line)==0)
continue;
//检查一行中匹配的数据个数是否有5个,少于5个则读下一行
items = sscanf(line, "%f%f%f%f%f",x,x+1,x+2,x+3,x+4);
if(items<5) continue; //此行合法数据个数不对, 读取下一行
//正确读取到一行的前5个数.创建结点,保存数据,并把结点加入链表
pnode p = (pnode)malloc(sizeof(node));
assert(p);
//为结点赋值
p->score1 = x[0];
p->score2 = x[1];
p->score3 = x[2];
p->score4 = x[3];
p->score5 = x[4];
p->listno = ++i; //原始编号
if (head == null) //创建的是第一个链表结点
{
head = p; tail = p;
}else //创建的非链表首结点
{
tail->next = p;
tail = p;
}
p->next = null; //尾插法,p作为新的链表尾
n++; //结点个数计数
} while(!feof(fp) );//读到文件结束才停止。
//开始用快速排序法排序(库函数提供的)
pnode *pp = (pnode *)calloc(n, sizeof(pnode));//指针数组,用于排序
p=head;
for(i=0;i {
pp[i] = p;
p=p->next;
}
qsort(pp, n, sizeof(pnode), compsturec2);//利用快速排序法排序
for (i=0;i {
pp[i]->rank = i+1;
}
//按照链表顺序(也就是文件行顺序)打印记录
p=head;
printf("打印记录:\n");
for (i =0;i {
printf("【学生%d】%.1f %.1f %.1f %.1f %.1f [名次:%d] | 后三项和:%.1f \n",
p->listno,p->score1, p->score2,
p->score3, p->score4, p->score5, p->rank,
(p->score3 + p->score4 +p->score5)); //后三个成绩的和
p=p->next;
}
return 0;
}
//回调函数,供qsort调用,用来建立比较大小的规则(逆序)
int compsturec2(const void *s1, const void *s2)
{//恢复s1,s2的真实意义,并取间接运算,保存在变量中
pnode rec1=*(pnode*)s1; //s1是指向一个个的记录元素的指针的二级指针
pnode rec2=*(pnode*)s2; //s2也是指向一个个的记录元素的指针的二级指针
float sum1 = rec1->score3 + rec1->score4 + rec1->score5; //后三项的和
float sum2 = rec2->score3 + rec2->score4 + rec2->score5; //后三项的和
if(sum1 < sum2) //按降序比较成绩。
return 1; //rec1指向的记录“小”,则返回1
else if (sum1 > sum2)
return -1; //rec1指向的记录“大”,则返回-1
else
return 0; //rec1和rec2“相等”,返回0
}
- 3楼网友:十鸦
- 2020-04-06 16:22
你输出的是字符串的首地址
- 4楼网友:舍身薄凉客
- 2019-08-26 14:40
您能告诉我%d是什么意思吗???!!! 为什么要把%d当成%p用 看地址 用%p ,建议你再看看格式化输出的相关小知识哦
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯