检查结构数组的NULL struct学生 { 整流罩; 字符*名称; }; int main() { int i; struct student arr[2]; arr[0]。滚动=12; arr[1].name=“John”; arr[1]。滚动=13; arr[1].name=“Craig”; 结构学生*ptr; ptr=arr; //这太完美了。 对于(i=0;iroll,ptr->name); } //这也可以。 printf(“%d%s”,ptr->roll,ptr->name); ptr++//进入下一个结构。 printf(“%d%s”,ptr->roll,ptr->name); //但这不好 while(*ptr | | ptr->name!=NULL) { ptr++; } 返回0; }
如何检查while循环中的指针?检查结构数组的NULL struct学生 { 整流罩; 字符*名称; }; int main() { int i; struct student arr[2]; arr[0]。滚动=12; arr[1].name=“John”; arr[1]。滚动=13; arr[1].name=“Craig”; 结构学生*ptr; ptr=arr; //这太完美了。 对于(i=0;iroll,ptr->name); } //这也可以。 printf(“%d%s”,ptr->roll,ptr->name); ptr++//进入下一个结构。 printf(“%d%s”,ptr->roll,ptr->name); //但这不好 while(*ptr | | ptr->name!=NULL) { ptr++; } 返回0; },c,pointers,structure,C,Pointers,Structure,如何检查while循环中的指针?ptr指向一个数组,如果将其递增,ptr开始指向一个非空的内存大小数组。 您可以执行以下操作: 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";
ptr
指向一个数组,如果将其递增,ptr
开始指向一个非空的内存大小数组。
您可以执行以下操作:
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;
}
ptr=arr;
而(ptr<(arr+sizeof(arr)/sizeof(arr[0])){
ptr++;
}
注意:此技术不适用于动态阵列
要了解此公式的含义,请阅读:如果遍历指针数组,并且知道该数组的结尾标记为null,则可以使用
ptr
检查null。你不是
实际上,您正在遍历一组结构,ptr直接指向第一个元素的内存位置
您必须跟踪数组的大小(或其填充元素的数量),并在完成所有操作后停止
ptr = arr;
while (ptr < (arr + sizeof(arr)/sizeof(arr[0])) ){
ptr++;
}
int count=2;
结构学生arr[计数];
结构学生*ptr=arr;
对于(int i=0;i,您可以使用:
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
}
我想指出的另一件事是,在使用字符串分配char*
指针之前,需要为其分配内存。您编写的最后一个循环根本不会执行,因为所有循环都是NULL
指针
另一种方法是在数组中最后一个结构的卷号中放入一些特殊值(比如负值),然后遍历数组直到卷号为正值。
请注意,此方法也可用于动态数组
struct student *ptr=arr;
int max_len = sizeof(arr)/sizeof(*arr);
while(max_len--)
{
//do something...
ptr++;
}
首先:*ptr
的值是一个结构,不能转换为布尔值,因此而(*ptr)
不会编译
为了空终止一个结构数组,您必须选择一个在初始化结构时永远不会为空的结构成员(通常是一个重要的指针),并将其用作标志。您确实有:name
字段
while(*ptr || ptr->name != NULL)
那么唯一的问题是数组实际上不是以NULL结尾的。您需要在末尾保留一个额外的第三个元素,就像字符串一样。一种简单的方法是在声明时将整个数组初始化为零。因此:
while(ptr->name != NULL)
这将与手动设置ar[2]具有相同的效果。name=NULL;
ptr
指向一个数组,如果你增加它,ptr
开始指向一个内存超出大小的数组,但是为什么这会运行一个额外的循环,即使这与我在(ptr->name!=NULL)时的情况相同即额外的垃圾value@user1502952为什么额外?我的答案是关于如何保存ptr
而不是指向实际上是未定义行为的外部数组。假设如果对于某些arr
索引值name
指向空值,则添加额外的检查。@user1502952类似于:while(ptr<(arr+sizeof(arr)/sizeof(arr[0])-1&&ptr->name!=NULL){在这里执行代码}
为什么-1
?我看不出为什么必须这样做-它甚至看起来无效!它会跳过最后一个元素。对于数组中的1个元素,它根本不会迭代。@Dariusz Math从数学上讲,我可能在这里没有被纠正,我应该删除吗?是的,一个额外的垃圾值。我不明白为什么会有垃圾值。两个循环都会遍历,直到e数组的nd和stop。这很完美。唯一的一点是使用固定大小的数组,我在检查时没有这样做(arr[2])。我想这更容易!然后我的答案是。
while(ptr->name != NULL)
struct student arr[3] = {0};
arr[0].roll = 12;
arr[0].name = "John";
...