struct student
{
int roll;
char *name;
};
int main()
{
int i;
struct student arr[2];
arr[0].roll = 12;
arr[1].name = "John";
arr[1].roll = 13;
arr[1].name = "Craig";
struct student *ptr;
ptr=arr;
// This is perfect.
for(i = 0; i<2; i++)
{
printf("%d %s", ptr->roll, ptr->name);
}
// This is also ok.
printf("%d %s", ptr->roll, ptr->name);
ptr++ // getting to next structure.
printf("%d %s", ptr->roll, ptr->name);
// But this isn't ok
while(*ptr || ptr->name != NULL)
{
ptr++;
}
return 0;
}
如何在while循环中检查指针?
答案 0 :(得分:3)
ptr
指向一个数组,ptr
开始指向一个非空的内存输出大小数组。
你可以这样做:
ptr = arr;
while (ptr < (arr + sizeof(arr)/sizeof(arr[0])) ){
ptr++;
}
注意:此技术不适用于动态数组。
要了解有关此公式的内容:Weird behavior when printing array in C?
答案 1 :(得分:2)
如果遍历指针数组并且当您知道此类数组的末尾标记为NULL时,可以使用ptr
检查null。你不是。
实际上,您正在遍历一个结构数组,其中ptr指向第一个元素的内存位置。
您必须跟踪数组的大小(或其填充元素的数量),并在完成所有操作后停止。
int count = 2;
struct student arr[count];
struct student* ptr = arr;
for (int i=0; i<count; i++) {
// do your stuff
ptr++; // place it in for if you like
}
答案 2 :(得分:1)
您可以使用:
struct student *ptr=arr;
int max_len = sizeof(arr)/sizeof(*arr);
while(max_len--)
{
//do something...
ptr++;
}
我想要指出的另一件事是你需要为char*
指针分配内存,然后再用字符串分配它。你写的最后一个循环根本不执行,因为所有都是{ {1}}指针。
其他方法是在数组中最后一个结构的滚动数(比如负值)中加入一些特殊值。然后遍历阵列,直到卷号为正。 请注意,此方法也可用于动态数组。
NULL
答案 3 :(得分:0)
while(*ptr || ptr->name != NULL)
首先要做的事情是:*ptr
的值是一个结构,它不能转换为布尔值,因此while(*ptr)
将无法编译。
为了对结构数组进行null终止,你必须选择一些结构成员,当初始化结构时(通常是一个重要的指针),你知道它永远不会为NULL,并将它用作标志。你有:name
字段。
while(ptr->name != NULL)
然后唯一的问题是你的数组实际上不是NULL终止。你需要在结尾处保留一个额外的第三个元素,就像字符串一样。一种简单的方法是在声明时对整个数组进行零初始化。所以:
struct student arr[3] = {0};
arr[0].roll = 12;
arr[0].name = "John";
...
这与手动设置ar[2].name = NULL;