cheoly's language study blog

포인터와 배열의 관계: C언어 초보자를 위한 이해와 활용

프로그래밍/C언어
반응형
SMALL

포인터와 배열은 매우 긴밀한 관계를 맺고 있으며, 어떤 부분에서는 서로를 대체할 수도 있습니다. 배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같습니다. 따라서 배열의 이름은 포인터 상수 (constant pointer)입니다.

간단히 설명하자면 둘다 비슷한 속성을 가지고 있지만 배열은 메모리공간을 사용자 마음대로 접근하며 데이터를 넣고 수정할 수 있다. 포인터 같은 경우에는 특정 메모리에 주소값을 가지고 있어서 간접참조를 하는 방식이다.

포인터와 배열의 차이점


배열은 변수 선언과 함께 자신의 데이터를 저장할 공간을 배열의 크기만큼 연속적인 공간을 가집니다. 포인터는 자신이 데이터를 저장할 공간을 가지지 않고 저장할 공간이 있는 위치를 저장하는 메모리 번지를 저장합니다.

배열은 그 자체가 크기 때문에 함수의 인수로 전달할 수 없지만 포인터는 대상체가 무엇이든간에 4바이트의 크기밖에 차지하지 않으므로 함수로 전달할 수 있습니다. 그래서 배열을 함수로 전달할 때는 반드시 포인터를 사용해야 합니다.

포인터와 배열의 사용 이유


일반적으로 포인터를 사용하는 목적은 동적으로 메모리를 할당하여 사용하기 위해서 사용합니다. 그리고 메모리가 할당된 후에는 배열처럼 사용하면 된다고 이전에 설명하였습니다.

배열은 변수들을 메모리상에 일렬로 나열해놓은 것과 마찬가지입니다. 배열도 메모리상에 존재하므로 엄연히 주소값이 존재합니다. 배열 포인터란 이 주소값을 가리키는 포인터를 말합니다. 이것이 유용한 이유는 바로 2차원 이상의 배열을 가리킬 때 포인터를 통해 배열과 같은 인덱싱을 할 수 있기 때문입니다. 함수에 2차원 이상의 배열을 파라미터로 던질 때 유용하게 사용됩니다.

배열과 포인터의 관계


배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같습니다. 따라서 배열의 이름은 포인터 상수 (constant pointer)입니다.

배열 포인터는 배열의 주소값을 저장하고 인덱싱할 수 있는 포인터를 말합니다. 배열 이름은 1차원 배열에서는 포인터와 같지만, 2차원 이상의 배열에서는 포인터의 역할을 하지 않습니다.

예제


#include <stdio.h>

int main(void) {
    int arr[3] = {1, 2, 3};
    int *ptr = arr; // 배열의 이름은 포인터 상수이므로 포인터 변수에 할당 가능

    printf("arr[0]: %d\n", arr[0]);
    printf("ptr[0]: %d\n", ptr[0]);
    printf("*ptr: %d\n", *ptr);

    ptr[0] = 4; // 포인터 변수를 이용해 배열의 값을 변경 가능
    printf("arr[0]: %d\n", arr[0]);

    return 0;
}

위의 예제에서 `arr`은 배열이고 `ptr`은 포인터 변수입니다. `arr`는 배열의 이름이므로 포인터 상수이기 때문에 `ptr`에 할당할 수 있습니다. 그리고 `ptr`을 이용해 배열의 값을 변경할 수 있습니다.

반응형
LIST

[C언어] 프로그래밍의 꽃 포인터! 포인터란?

프로그래밍/C언어
반응형
SMALL

C언어에서 포인터는 메모리의 주소값을 저장하는 변수입니다. 포인터를 이해하기 전에 변수와 메모리, 메모리의 주소체계를 확인해보고 넘어간다. 변수를 선언한다는 것은, "메모리의 특정공간을 할당해서 그곳에 데이터를 저장하겠다"는 의미입니다.

포인터 변수가 주소를 저장하려면 변수의 주소를 알아야 하는데 변수 이름 앞에 & 연산자를 붙이면 해당 변수의 시작 주소를 반환합니다. 더 나아가서 포인터 변수가 저장하는 변수의 주소에 저장된 값을 참조하려면 * 연산자를 사용합니다.

포인터 변수도 변수이므로 사용하려면 먼저 선언을 해야합니다. 포인터 변수의 선언은 자료형 다음에 *연산자를 붙이고 포인터 변수의 이름을 쓰게 됩니다.

예시를 보며 자세히 알아볼까요.

다음은 포인터 변수의 선언과 사용에 대한 예제입니다.

#include <stdio.h>

int main() {
    int * p = NULL;
    int i = 10;

    p = &i;
    printf("변수 i의 주소값 : %p \n", &i);
    printf("포인터 p의 값 : %p \n", p);
    printf("포인터 p이 가리키는 값 : %d \n", *p);

    return 0;
}

위의 예제에서 `int * p = NULL;`은 포인터 변수 `p`를 선언하고 초기화하는 부분입니다.
`p = &i;`는 `i` 변수의 주소를 `p` 포인터 변수에 대입하는 부분입니다.
`printf("포인터 p이 가리키는 값 : %d \n", *p);`는 `p`가 가리키는 주소에 있는 변수의 값을 출력하는 부분입니다.

반응형
LIST

Visual studio와 QT 연동하기

프로그래밍/C++
반응형
SMALL

오랜만에 글을 쓰는데요..

 

회사에서 어쩌다보니 QT 프로그램을 쓰게 되었네요.

 

근데 저는 QT가 익숙하지 않네요.

 

그래서 익숙한 Visual studio에 QT를 연동해 봤습니다!!ㅋㅋㅋㅋ

 

 

저 위에 있는 거는 사진이죠...ㅋㅋㅋㅋㅋ

 




 

그냥 이대로 따라하시면 다 완료 됩니다!!!ㅋㅋㅋㅋ

 

QT프로젝트는 그냥 파일에서 열면 안열려요..

 

꼭 QT5탭이 생긴거 확인하고 거기에서 프로젝트를 열어야 합니다.

 

참고하시길....

반응형
LIST

비주얼 스튜디오 2015 c언어 프로젝트 만들기부터 hello world까지

프로그래밍/C언어
반응형
SMALL

지난 시간에 비주얼 스튜디오 무료 버전을 설치했었죠


2016/06/24 - [프로그래밍] - 비주얼 스튜디오 2015 무료 버전 설치


이번에는 C언어 프로젝트 만들기로 해볼게요..


어떻게 보면 C, C++ 동일하게 생각해도 될 것 같네요^^


확장자만 다르면 끝이니까요.


그러면 이제 프로젝트 하나 생성해서 hello world를 한 번 찍어 볼까요??


비주얼 스튜디오 2015 실행하면 이렇게 뜹니다.



좀 더 기다리면 아래와 같은 화면이 뜨죠..


첫 실행할 때에는 주로 사용할 언어를 물어봐요^^



여기에서 새 프로젝트를 눌러줍니다.



저는 기본 언어를 C#으로 선택해서 C#이 젤 위에 있어요.


여튼 C언어를 만들기 위해서는 C++을 선택하고 WIN32콘솔 응용프로그램을 선택하시고


이름과 솔루션이름을 원하는 이름으로 바꿔주세요.






위치도 바꿔주셔도되요^^


그 후 확인을 눌러줍니다.



여기서 다음을 누르구요



빈프로젝트에 체크를 해주고 마침을 눌러주세요.



그러면 이렇게 화면이 뜹니다.


여기에서 소스파일에서 마우스 우클릭하구요.


캡쳐가 안되서 말로 설명할게요


추가에 마우스포인터를 갖다 댑니다.


그 후 새항목을 눌러주면 아래와 같은 화면이떠요.



여기서 확장자를 .C로 바꿔줍니다.


이러면 C언어구요.


CPP를 해주면 C++이 되요..ㅋㅋㅋㅋㅋ


그냥 차이가 없다고 보면되요..


이 카테고리가 C언어라서 저렇게 한거죠.


이제 hello world 찍는 코딩을 해볼까요.


엄청 간단하죠??ㅋㅋ


stdio.h 파일을 인쿠르드 하면 c언어구요.


iostream을 하면 c++이죠..


확장자에 따라서 컴파일러가 되고 안되고 있으려나..


궁금하신 분들은 한 번 실험해보시길..^^


사실 요즘 이런 확장자로 코딩을 잘 안하거든요..


저는 주로 c#, mfc, labview 이용해서 윈도우 프로그래밍만 하고 있다보니....ㅋㅋㅋㅋㅋ


stdio.h는 printf문을 사용하기 위한 해더파일입니다.


스트디오점에이치 이러지말고 좀 유식해 보이기 위해서


스탠다드아이오점에이치라고 써보는 것은 어떨까요??


스탠다드인아웃점에이치보다는 위에거가 좀 낫죠??ㅋㅋㅋㅋ


여튼 다하고 ctrl+f5를 눌러줍니다.


방금 실수로 f5를 눌러버리는 바람에 포스팅 날라갈뻔했네요...ㅋㅋ


그러면 아래와 같은 화면이....


그냥 f5를 누르면 순식간에 아래 콘솔창이 켜졌다 사라져요~~ㅋㅋㅋ



반응형
LIST

C언어의 꽃이라 해야하나요.. if 구문(조건문)

프로그래밍/C언어
반응형
SMALL

오늘은 if구문을 얘기해보려고 합니다.


모든 프로그램에는 이 조건문을 잘 써야죠..


어떻게 보면 인터럽트이기도 하니까요..


똑같은 일상에 만약 어떤 것이 있으면 이것을 행해라 이것이죠..


for 문에서 계속 수행하다가 일정 숫자가 되면 그만 돌아라는 것도 한 예이구요.


for(i = 0; i < 100; i++)

{

if(i == 50)

{

i = i+ 40;

}

}


이런식으르루요..


아니면 그냥 break 를 걸어서 for문을 빠져 나와도 되구요.


if문을 쓸 때, 간혹 실수하는 부분이 있어요.


위에서 보면 if(i == 50) 이라는 부분있죠..


간혹 코딩 빠르게 하다보면 if(i = 50)이렇게 써버릴 때가 있어요.


이러면 진짜 난감합니다.


오류도 안나서 디버깅이 힘들죠..


어떤 툴이었더라 잡아주는 것도 있었던 것으로 기억은합니다만..


안잡아 주는 경우도 많아요..ㅋㅋ


그니깐 잘 확인해서 꼭 실수 안하시길 바랄게요..^^

반응형
LIST

[C언어 기초] for 구문, while 구문(반복문)

프로그래밍/C언어
반응형
SMALL

오늘은 반복문에 대해서 알아보려고 합니다.


반복문에는 for 문과 while 문이 있죠..


사실 전 mcu를 사용하기 전까지는 for문만 사용했었는데요..


mcu를 배우고 거기에 코딩을 하면서 부터 while문도 사용하게 되었습니다.


사용법은 간단해요.


#include <stdio.h>


int main(void)

{

int i = 0;


for(i = 0; i < 10; i++)

{

printf("abc\n");

}

}


이렇게 하면 콘솔 실행창에는 다음과 같이 나오죠,


abc

abc

abc

abc

abc

abc

abc

abc

abc

abc


이렇게 10개가 찍힙니다.


그러면 하나하나 알아볼까요..


for문을 돌리기 위해서는 몇 번을 돌릴건가를 알아야죠.


그래서 정수형 변수 하나를 만들어줍니다.


그리고 for 문 안에서 시작 카운트를 몇부터 할 지 정해주죠.


정해주고 나면 ; 이놈을 이용해서 끝내주고 몇 번을 돌릴지 정합니다.


저는 0부터 시작을 하기에 10번돌리고 싶어서 숫자 10으로 해줬어요.


그리고 10보다 작을 동안은 하나씩 증하가라는 의미로 i++을 해줬습니다.


쉽죠..^^


while은 while() 여기에서 () 안에 내용이 참이면 계속 반복합니다.


쉽게 말하면 ()의 내용이 참인 동안 실행한다라고 생각하면되요.


while의 뜻과 같죠??^^


mcu공부를 하다보면 main문 안에 항상 while(1)이라는 것을 볼 수 있어요.


대부분의 코딩은 저 안에 들어가 있죠.


이것이 반복문의 내용 전부입니다..^^


간단하죠??^^


반응형
LIST

[C언어 기초 강좌 1] C언어의 기본 printf, scanf, hello world

프로그래밍/C언어
반응형
SMALL

프로그래밍 언어를 공부하면서 가장 처음에 하는 것이

 

hello world를 찍는 것인데요.

 

어떤 프로그래밍을 하더라도 가장 먼저 하는 것이 내가 원하는 글자를 출력하는 것이더군요.

 

그것을 출발로 이것저것 배우는 것이죠.

 

C언어를 만든 사람이 죽고나서 good bye world로 바뀌었다고

 

하기도 하는데요.

 

저는 잘 모르겠군요..

 

그냥 hello world로 하겠습니다.

 

C언어에서 가장 기본 적은 문법은 printf와 scanf를 쓸려면

 

stdio.h 파일을 인크루드 해줘야 합니다.

 

이제 막 C언어를 접하는 사람들은 무슨 소린가 싶겠네요.

 

그냥 이렇게 하는 거구나 생각하세요..ㅋㅋㅋ

 

printf를 구현하기 위한 여러 문법들을 오브젝트 파일 같은 곳에 넣어놓고

 

헤더파일을 인크루드해서 그냥 갖다 쓸 수 있게 만들었다는 것은

 

나중에 실력이 쌓인 후에 알면 되니까요..^^

 

대부분의 개발자들이 C언어를 사용하는데 Visual studio를 사용하죠.

 

간혹 eclipse 를 사용하는 개발자도 있구요.

 

회사에서 visual studio를 사줄 돈이 없으면 이클립스를 사용하죠..ㅋㅋ

 

여튼 이런 것들은 코딩 편집을 쉽게하고

 

컴파일러도 다 들어 있기 때문에 사용자는 그냥 F7같은 컴파일 버튼만 누르면 되죠.

 

F5도 컴파일하죠 다른 버튼 조합도 있고..

 

개발에서 손을 놓은지 좀 되서 기억이안나네요..ㅋㅋㅋ

 

그럼 간단한 hello world를 찍어보죠.

 

참고로 stdio.h의 stdio는 standard input output입니다.

 

스트디오점 에이치라 하지마시고 스탠다드 IO로 읽어주세요..^^

 

좀 있어보이잖아요~~ㅋㅋㅋ

 

#include <stdio.h>

 

int main(void)

{

printf("hello world!!");

 

return 0;

}

 

끝입니다.

 

이것보다 더 간단하게도 되죠.

 

#include <stdio.h>

 

void main(void)

{

printf("hello world!!");

}

 

별 차이 없죠.

 

결과는 같아요..

 

int와 void에 관해서는 나중에 함수를 포스팅할 때 알아볼게요.

 

그냥 머릿속에 있는 것들을 막 꺼내다보니 그냥 두서가 없는 것 같기도하고..ㅋㅋㅋ

 

솔직히 수업한번 들어본 사람은 printf에 대해서 모를 수 없고..

 

printf 관련해서 가장 많이 검색하는 부분이 무엇일까요?

 

바로 %c %d 와같은 문자들입니다.

 

 

이렇게 정의가 되요..^^

 

scanf는 그냥 간단히 말하면 입력을 받기위한 것이에요.

 

그러면 또 한 번 코딩해볼까요?

 

#include <stdio.h>

 

void main(void)

{

int n = 0;

 

printf("숫자를 입력하세요 : ");

scanf("%d\n", &n);

printf("입력한 숫자는 %d입니다.\n", n);

}

 

이렇게 하면 끝나죠..

 

그러면 출력은 어떻게 될까요?

 

그냥 한 번 실행하면

 

출력창

----------------------------------------

숫자를입력하세요 : 

----------------------------------------

 

이상태에서 있습니다. 숫자를 입력하고 엔터를 치면되요.

 

그러면 10이라는 숫자를 쳤다고 할게요.

 

출력창

----------------------------------------

숫자를입력하세요 : 10

입력한 숫자는 10입니다

계속하려면 아무키나 누르세요.

----------------------------------------

 

이렇게 되죠.

 

머 저렇게 되는지 안되는 지는 한 번 해보세요..^^

반응형
LIST