모두의 코드 커뮤니티

함수의 인자로서 *arg VS &arg의 차이가 궁금합니다

안녕하세요!
c언어를 배우기 시작한지 얼마 안됐는데요
몇가지 예제들을 시행해보다가 이해가 잘 안되는 부분이 있어서 질문드립니다

int p;
int *q;
이렇게 두 변수가 있다고 할때 함수의 인자값으로 포인터를 받는
void some_function (int *pointer_arg) 이런 함수가 있다고 하면
some_function(&p); 와
some_function(q);로 했을 때
q를 넣으면 segmentation fault가 나고 &p을 넣으면 제대로 값이 나오는 함수들이 있던데 어떤 경우에 이런 차이가 발생할 수 있나요?
검색을 좀 해봐도 키워드를 뭐라고 해야할 지 몰라서 그런지 시원한 대답이 없네요…

  1. 또 이런 경우엔 함수가 요구하는 인자가 일반 변수의 주소값을 말하는건지 포인터를 말하는 건지 어떻게 확인할 수 있나요?

  2. 또 struct A가 구조체 B(구조체 B의 포인터가 아닌 일반 구조체)를 멤버로 포함한다고 했을때
    struct B *b = &A.B; 를 했을 때 segmentation fault를 뱉은 경우가 있는데 이 경우도 잘 이해가 되질 않아요 이런 경우가 어떤 경우에 발생할 수 있을까요?

말주변이 없어서 질문이 제대로 전달됐을 지 걱정스럽네요
혹시 제가 뭔가 잘못된 방식으로 제 문제를 전달하고 있다면 가감없이 말씀해주시면 감사하겠습니다
감사합니다

파라미터가 포인터인 함수에 관한 검색 키워드

Call by pointer (call by address)
Call by value

포인터인지 주소값인지…

주소값을 넘겨주니까 주소값을 말 할 수 있겠네요.

구조체 문제

쉽게 말해서? A.B 라는 타입을 가지는 변수를 가르키지 않네요.

  1. c언어에도 call by reference가 있나요? 검색해보니 c++ 내용인거같은데…
    c언어는 모두 call by value 아닌가요?

  2. 구조체 문제에서 A.B의 타입은 struct B 아닌가요?
    그니까 &A.B의 타입은 struct B * 일거같은데 말씀하신게 무슨 뜻인지 와닿지가 않는데 한번만 더 설명해주실 수 있나요?

Reference 는 C++ 내용입니다. Call by pointer 정도로 찾아보세요.

구조체 문제에서 A.B의 타입은 struct B 아닌가요?
그니까 &A.B의 타입은 struct B * 일거같은데 말씀하신게 무슨 뜻인지 와닿지가 않는데 한번만 더 설명해주실 수 있나요?

struct A {
    struct B { int a; };
};

int main()
{
    struct B.a = 10; // 불가능

    struct B b;
    b.a = 10; // 가능

    return 0;
}

엇 말씀하신대로 생각해보니 좀 알거같아요
함수가 내부에서 인자로 받아준 주소값 메모리에 뭔가 할당하고 싶어할 때 &로 받겠네요
그게 아니라 포인터로 인자를 주고싶으면 malloc으로 메모리를 할당해놓고 줘야할거같아요 좀 더 확인해봐야겠어요 감사해요 ㅠㅠ

좋아요 1

이건 제가 질문을 좀 헷갈리게 한것 같아요
typedef struct _B {
int g;
} B;
typedef struct _A {
B b;
} A;
가 있다고 하면
B *b;
b = &A.b;
를 했을 때 에러를 뱉던 거였는데 좀 더 찾아보겠습니다 답변 감사해요