Is this code correct? It runs as expected, but is this code correctly using the pointers and dot notation for the struct?
这段代码是否正确?它按预期运行,但这个代码是否正确使用结构的指针和点表示法?
struct someStruct {
unsigned int total;
};
int test(struct someStruct* state) {
state->total = 4;
}
int main () {
struct someStruct s;
s.total = 5;
test(&s);
printf("\ns.total = %d\n", s.total);
}
5 个解决方案
#1
42
Your use of pointer and dot notation is good. The compiler should give you errors and/or warnings if there was a problem.
你使用指针和点符号是好的。如果出现问题,编译器应该给出错误和/或警告。
Here is a copy of your code with some additional notes and things to think about so far as the use of structs and pointers and functions and scope of variables.
下面是代码的副本,其中包含一些额外的注释和事项,可以考虑使用结构和指针以及函数和变量范围。
// Define the new variable type which is a struct.
// This definition must be visible to any function that is accessing the
// members of a variable of this type.
struct someStruct {
unsigned int total;
};
/*
* Modifies the struct that exists in the calling function.
* Function test() takes a pointer to a struct someStruct variable
* so that any modifications to the variable made in the function test()
* will be to the variable pointed to.
* A pointer contains the address of a variable and is not the variable iteself.
* This allows the function test() to modify the variable provided by the
* caller of test() rather than a local copy.
*/
int test(struct someStruct *state) {
state->total = 4;
return 0;
}
/*
* Modifies the local copy of the struct, the original
* in the calling function is not modified.
* The C compiler will make a copy of the variable provided by the
* caller of function test2() and so any changes that test2() makes
* to the argument will be discarded since test2() is working with a
* copy of the caller's variable and not the actual variable.
*/
int test2(struct someStruct state) {
state.total = 8;
return 0;
}
int test3(struct someStruct *state) {
struct someStruct stateCopy;
stateCopy = *state; // make a local copy of the struct
stateCopy.total = 12; // modify the local copy of the struct
*state = stateCopy; /* assign the local copy back to the original in the
calling function. Assigning by dereferencing pointer. */
return 0;
}
int main () {
struct someStruct s;
/* Set the value then call a function that will change the value. */
s.total = 5;
test(&s);
printf("after test(): s.total = %d\n", s.total);
/*
* Set the value then call a function that will change its local copy
* but not this one.
*/
s.total = 5;
test2(s);
printf("after test2(): s.total = %d\n", s.total);
/*
* Call a function that will make a copy, change the copy,
then put the copy into this one.
*/
test3(&s);
printf("after test3(): s.total = %d\n", s.total);
return 0;
}
#2
15
That's correct usage of the struct. There are questions about your return values.
这是结构的正确用法。您的退货值存在疑问。
Also, because you are printfing a unsigned int, you should use %u
instead of %d
.
另外,因为您正在打印unsigned int,所以应该使用%u而不是%d。
#3
3
Yes, that's right. It makes a struct s
, sets its total to 5, passes a pointer to it to a function that uses the pointer to set the total to 4, then prints it out. ->
is for members of pointers to structs and .
is for members of structs. Just like you used them.
恩,那就对了。它创建一个struct,将其总数设置为5,将指向它的指针传递给一个函数,该函数使用指针将总数设置为4,然后将其打印出来。 - >是指向结构和指针的成员。是结构的成员。就像你使用它们一样。
The return values are different though. test
should probably be void, and main
needs a return 0
at its end.
但返回值不同。测试应该是无效的,并且main需要在其结尾处返回0。
#4
1
Yep. It's correct. If it wasn't (from the . / -> point of view), your compiler would yell.
是的。这是正确的。如果不是(从./->的角度来看),你的编译器会大喊大叫。
#5
0
Yes, its correct usage of structures. You can also use
是的,它正确使用结构。你也可以使用
typedef struct someStruct {
unsigned int total;
} someStruct;
Then you won't have to write struct someStruct s;
again and again but can use someStruct s;
then.
那么你就不必编写struct someStruct了;一次又一次,但可以使用someStruct s;然后。
#1
42
Your use of pointer and dot notation is good. The compiler should give you errors and/or warnings if there was a problem.
你使用指针和点符号是好的。如果出现问题,编译器应该给出错误和/或警告。
Here is a copy of your code with some additional notes and things to think about so far as the use of structs and pointers and functions and scope of variables.
下面是代码的副本,其中包含一些额外的注释和事项,可以考虑使用结构和指针以及函数和变量范围。
// Define the new variable type which is a struct.
// This definition must be visible to any function that is accessing the
// members of a variable of this type.
struct someStruct {
unsigned int total;
};
/*
* Modifies the struct that exists in the calling function.
* Function test() takes a pointer to a struct someStruct variable
* so that any modifications to the variable made in the function test()
* will be to the variable pointed to.
* A pointer contains the address of a variable and is not the variable iteself.
* This allows the function test() to modify the variable provided by the
* caller of test() rather than a local copy.
*/
int test(struct someStruct *state) {
state->total = 4;
return 0;
}
/*
* Modifies the local copy of the struct, the original
* in the calling function is not modified.
* The C compiler will make a copy of the variable provided by the
* caller of function test2() and so any changes that test2() makes
* to the argument will be discarded since test2() is working with a
* copy of the caller's variable and not the actual variable.
*/
int test2(struct someStruct state) {
state.total = 8;
return 0;
}
int test3(struct someStruct *state) {
struct someStruct stateCopy;
stateCopy = *state; // make a local copy of the struct
stateCopy.total = 12; // modify the local copy of the struct
*state = stateCopy; /* assign the local copy back to the original in the
calling function. Assigning by dereferencing pointer. */
return 0;
}
int main () {
struct someStruct s;
/* Set the value then call a function that will change the value. */
s.total = 5;
test(&s);
printf("after test(): s.total = %d\n", s.total);
/*
* Set the value then call a function that will change its local copy
* but not this one.
*/
s.total = 5;
test2(s);
printf("after test2(): s.total = %d\n", s.total);
/*
* Call a function that will make a copy, change the copy,
then put the copy into this one.
*/
test3(&s);
printf("after test3(): s.total = %d\n", s.total);
return 0;
}
#2
15
That's correct usage of the struct. There are questions about your return values.
这是结构的正确用法。您的退货值存在疑问。
Also, because you are printfing a unsigned int, you should use %u
instead of %d
.
另外,因为您正在打印unsigned int,所以应该使用%u而不是%d。
#3
3
Yes, that's right. It makes a struct s
, sets its total to 5, passes a pointer to it to a function that uses the pointer to set the total to 4, then prints it out. ->
is for members of pointers to structs and .
is for members of structs. Just like you used them.
恩,那就对了。它创建一个struct,将其总数设置为5,将指向它的指针传递给一个函数,该函数使用指针将总数设置为4,然后将其打印出来。 - >是指向结构和指针的成员。是结构的成员。就像你使用它们一样。
The return values are different though. test
should probably be void, and main
needs a return 0
at its end.
但返回值不同。测试应该是无效的,并且main需要在其结尾处返回0。
#4
1
Yep. It's correct. If it wasn't (from the . / -> point of view), your compiler would yell.
是的。这是正确的。如果不是(从./->的角度来看),你的编译器会大喊大叫。
#5
0
Yes, its correct usage of structures. You can also use
是的,它正确使用结构。你也可以使用
typedef struct someStruct {
unsigned int total;
} someStruct;
Then you won't have to write struct someStruct s;
again and again but can use someStruct s;
then.
那么你就不必编写struct someStruct了;一次又一次,但可以使用someStruct s;然后。