Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查结构数组的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 - Fatal编程技术网

检查结构数组的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; }

检查结构数组的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";

如何检查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";

  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";
...