1

일부 규칙에 따라 전역 변수 변수를 증가시키고 참조로 변수를 전달하는 함수가있는 경우 반환해야합니까, 아니면 변수가 업데이트됩니까? 이것은 로컬 변수에서도 작동합니까? 예를 들어 :변수의 주소를 전달하면 반환해야합니까?

static uint8_t counter = 1; 

void add(uint8_t *variable) 
{ 
    if (*variable == 5) 
    { 
    *variable = 7; 

    } else if (*variable == 20) 
    { 
    *variable = 1; 
    } else 
    { 
    *variable++; 
    } 
} 

그리고 어디 선가 '추가'함수를 호출 좋아 :

void function(void) 
{ 
... some code... 
add(&counter); 
... some code... 
} 
+0

어쩌면 나는 잘못하고있다.이 문제를 해결할 더 좋은 방법이있다. – NitrogenAir

+0

전역 (하지만'static') 변수가 있고'add' 함수가 같은 번역 단위에 있다면 , 왜 처음부터 논쟁을해야합니까? –

+0

이 코드는 일반적으로 거의 의미가 없지만 실제로는 포인터의 값을 전달하는 것처럼 보입니다 (ref가 아닌). 변수가 전역이면 전달할 필요가 없습니다. 또한 add에서 두 개의 역 참조가 필요하지 않을 수도 있습니다. – George

답변

2

이 코드는 개체가 참조로 전달되므로 전역 변수인지 로컬 변수인지에 관계없이 모든 종류의 변수와 함께 작동합니다.

그러나 더 나은 인터페이스는 함수가 인수로 가져 오는 포인터를 반환 할 때입니다.

uint8_t * add(uint8_t *variable) 
{ 
    if (*variable == 5) 
    { 
    *variable = 7; 

    } else if (*variable == 20) 
    { 
    *variable = 1; 
    } else 
    { 
    *variable++; 
    } 

    return variable; 
} 

이 경우 함수 호출을 결합하거나 동일한 포인터를 기다리는 다른 함수와 함께 사용할 수 있습니다.예를 들어

add(add(&counter)); 

또는

SomeOtherFunction(add(&counter)); 

기능이 멀티 스레드 환경에서 호출 및 전역 변수가 더 기억 클래스 _Thread_local 지정이없는 경우의 차이가 존재한다.

1

전역 변수를 피하십시오.

전역 변수를 사용해야하는 경우 전역 변수를 전달하지 않아도됩니다. 직접 수정할 수도 있습니다. 즉, 전달하거나 반환하지 않아도됩니다.

static uint8_t counter = 1; 

void add(void) 
{ 
    if (counter == 5) { 
    counter = 7; 
    } else if (counter == 20) { 
    counter = 1; 
    } else { 
    counter++; 
    } 
} 

당신은 전역 변수와 함수에서 전달 된 일부 지역 변수 모두를 위해 작동해야하는 기존의 인터페이스 add()를 사용하는 경우. 그런 다음 기존 함수는 그대로이며 변수를 수정하고 내용을 업데이트하려는 주소를 그대로 반환 할 필요가 없습니다.

+0

예, 전역 변수를 사용하고 있지만 로컬 변수에도이 변수를 사용할 수 있기를 원했습니다. 나는 단순히 변수의 값을 전달하고 증가 된 값을 반환 할 수 있다는 것을 알고 있지만 포인터를 사용하는 것이 더 효율적으로 보였다. – NitrogenAir

+0

나는 그것이 가능성 중 하나라고 생각했다. 그래서 마지막 단락을 추가했습니다. 이 경우 함수가 좋으며 로컬 변수와 전역 변수 모두에서 작동합니다. 사실, add() 함수가 관련되어있는 한, 객체의 수명은 중요하지 않다. 전달할 때마다 업데이트 될 것이다. 그러나 여러 스레드를 가지고 있고 여러 함수에'counter '의 주소를 전달하거나 다중 스레드에서'counter'의 값을 사용하는 경우 * 데이터 경쟁 *을 알아 두십시오. – usr

0

전역 변수 (파일 범위) 변수의 경우 함수에 명시 적으로 전달할 필요가 없습니다. 이미 전역 범위에 있으며 모든 기능 (블록 범위)에서 액세스 할 수 있습니다. 로컬 (내부) 범위에 동일한 이름의 다른 로컬 식별자가 없습니다. 말했다

, 지점 대답에 이, 아니, 업데이트 된 값을 반환 할 필요가 없습니다, 그것은 이미 실제 인수 (counter)에 반영되어 함수에 전달. 이것은 전역 범위와 비전 역 범위 변수 모두에 대해 동일합니다.

0

전역 변수는 파일 전체에서 가시성을 가지므로 해당 주소를 전달하는 함수에 전역 변수가 알려져 있습니다.

왜 전역 변수가 함수 내에 표시 될 때 포인터가 필요합니까?

값을 변경할 수 있으며 변경된 값은 호출 기능에서 볼 수 있습니다.

귀하의 질문은 당신이 변수 위치로 변경된 사항의 ​​주소를 통과하고 있기 때문에 함수에서 아무것도 반환 할 필요는

void func(int *q); 

    int main() 
    { 
     int a; 
     func(&a); 
     printf("%d \n",a); 
    } 

    void func(int *q) 
    { 
     *q = 10; 
    } 

아닌 글로벌 변수에 대한 호출에서 볼 수 없었다 경우 함수