포인터와 배열

배열의 이름은 상수 형태의 포인터. 그래서 배열의 이름을 가리켜 포인터 상수라 부르기도 한다

배열의 이름도 포인터이기 때문에 배열의 이름을 피연산자로 하는 *연산이 가능.

1차원 배열이름의 포인터 형은 배열의 이름이 가리키는 대상을 기준으로 결정.

(예제1)

 


 

 

int *

p

int [ ]

arr

 

int *p;

int arr[3];

p[]

*arr

&arr[1]==*(arr+1)

(예제2)

 

 

상수형태 문자열을 가리키는 포인터.

변수 형태 문자열

char str1[] = "My String"; //스택영역에 저장

상수 형태의 문자열

char * str2 = "Your String"; //코드영역에 저장

(예제1)

 (예제2)

문자열 배열 입력

(예제1)

포인터 변수로 이뤄진 배열 : 포인터 배열

(예제1)

 (예제2)

 

(예제3)(char*strArr[3]={0x1004,0x1048,0x2012})


포인터와 함수에 대한 이해

함수의 인자로 배열 전달. 배열은 함수인자로 넘길 수 없다. 매개변수로 배열을 선언할 수 없기때문에 배열을 통째로 넘겨받으려면 매개변수로 배열을 선언할 수 있어야 한다. 

고로 포인터를 써서 넘겨야 한다.



배열을 함수의 인자로 전달받는 함수의 또 다른 선언

(예제1)


call-by-value : 값을 전달하는 형태의 함수호출

 



call-by-reference : 주소 값을 전달하는 형태의 함수호출

 


배열 - 배열을 arr[3]으로 선언을 하고 값을 넣어도 값은 들어감. 할당되지 않은

 메모리 공간을 침범하게 되는데 반응은 상황에 따라 틀림.

 일반 변수와 틀리기 때문에 선언되면 주소가 된다.

 

int arr[3]

arr[0]=1

arr[1]=2

arr[2]=3

arr[3]=4 할당되지 않은 메모리 공간.

arr[4]=5 할당되지 않은 메모리 공간.

배열이름을 sizeof로 넣으면 연산결과로는 바이트 단위의 배열크기가 반환된다.

(예시1)

(예시2)

(예시3)

문자열

 

char str[] = "Good morning!(null)"; 따옴표로 하면 끝자리 (null) 14byte초기화됨.

원래 13byte

str[0]='G' - G에 대한 아스키코드가 나옴.

str 자체는 주소이다.

%s - 하나하나의 문자의 아스키코드 값을 가져와서 문자열로 찍어냄.

간에 null이 찍히면 종료로 인식 되서 끊기게 된다.

 

심볼

 

char[]

str(주소)=12FF64

12FF64

char *(주소)

   

char *

   

 

심볼

char[]

str(주소)=12FF64

12FF64

char *(주소)

cp1

char *

cp2

 

str[0]

str[1]

str[2]

str[3]

str[4]

str[5]

str[6]

str[7]

str[8]

str[9]

str[10]

str[11]

str[12]

str[13]

G

o

o

d

 

m

o

r

n

i

n

g

!

null

 

(예시1)

(예시2)

 

  포인터와 배열의 관계

1차원 배열이름의 포인터 형은 배열의 이름이 가리키는 대상을 기분으로 결정.

(예시1)

(예시2)

(예시3)

(예시4)

(예시5)

(예시6)

 

 

전역변수 - 어디서든 접근이 가능한 변수, 지역변수와 달리 중괄호 내에 선언되지 않음.

                       프로그램의 시작과 동시에 메모리 공간에 할당되어 종료 시까지 존재.

                       별도의 값으로 초기화하지 않으면 0으로 초기화된다.

                       프로그램 전체 영역 어디서든 접근이 가능. 될 수 있으면 줄여서 써야한다.

                       그러나 자주 생겼다 지워졌다하는 변수가 있으면 느려져서 전역변수를

                       생성하는 게 낫다. 하나의 전역변수만으로 프로그램이 복잡해질 수 있다.

 

지역변수 : Run Time()

전역변수 : Compile Time 실행파일

전역변수 - 초기화 시킨 변수들은 Data영역 주소로 들어감.

초기화 시키지 않은 변수들은 BSS영역 주소로 들어감.

 

메모리구조

Code - 함수. 상수가 포함됨Read Only

Data - 전역변수 초기화시킨 변수

BSS - 전역변수 초기화안시킨 변수.

         어떤 변수가 들어오든 0으로

         BSS자체가 0으로 덮여있음.

heap - 동적할당

stack - 지역변수

 

 

프로그램영역

행위(사고,ALU(연산담당))

기억(레지스터)

(CU) 컴퓨터는 인간을 모델링함.

(예시1)


해당 지역 내에서는 전역변수가 가리워지고, 지역변수로의 접근이 이뤄진다.

(예시2)


 static 지역변수 - 선언된 함수 내에서만 접근이 가능하다. 함수 내에서 선언된 지역변수는 

            해당함수가 반환하면 소멸된다

1회 초기화되고 프로그램 종료 시 까지 메모리공간에 존재.

 (예시1)

(예시2)

재귀함수 - 자기 자신을 다시 호출하는 함수. 시스템에 치명적인 손상을 입힐 수 있다.




(예시1)


배열 - 다수의 데이터를 저장하고 처리하는 경우에 유용하게 사용할 수 있는 것.

             배열의 위치 정보를 명시하는 인덱스 값은 1이 아닌 0에서부터 시작.

 

int iNum[9];

int iCnt;

iNum[0] - 4byte

iNum[1] - 4byte

iNum[2] - 4byte

iNum[3] - 4byte

iNum[4] - 4byte

iNum[5] - 4byte

iNum[6] - 4byte

iNum[7] - 4byte

iNum[8] - 4byte

 (예시1)

(예시2)


20140321 - 함수와 지역변수

c언어 2014. 3. 22. 17:41 Posted by Owen.K

함수 - 어떤 기능을 제공하는 것. 함수는 이름이 있어야 호출할 수 있고,

함수가 호출될 때 데이터의 입력이 가능해야 함.

함수 호출이 완료될 때 출력이 가능해야 한다.

이전에 함수선언을 해줘야 한다.

 

int Add (int num1, int num2) //;만 있으면 원형이고,

//중괄호 있으면 정의해놓은 것.

{

int result = num1 + num2;

return result;

}

 

(예시1)

(예시2)

 

함수는 전달인자의 유무와 반환 값의 유무에 따라서 함수를 네 개의 형태로 나눔.

유형 1 : 전달인자 있고, 반환 값 있다.

 유형 2 : 전달인자 있고, 반환 값 없다.

유형 3 : 전달인자 없고, 반환 값 있다.

유형 4 : 전달인자 없고, 반환 값 없다.

.h (전처리할 때)

.lib(링크)

 

(예시3)

(예시4)

(예시5)

 

(문제1)

(문제2)

(문제3)

지역변수 - 중괄호에 의해 형성되는 영역. 중괄호 내에 선언되는 변수는 모두 지역변수이다.

     지역변수는 해당지역을 벗어나면 자동으로 소멸된다. 선언된 지역 내에서만

     유효 하기 때문에 언된 지역이 다르면 이름이 같아도 문제가 되지 않는다.

  (예시1)

20140319 - 포인터2 메모리 관련 표현법

c언어 2014. 3. 19. 16:56 Posted by Owen.K

포인터 - 주소 값의 저장을 목적으로 선언되는 포인터 변수

                  메모리의 주소 값을 저장하기 위한 변수이다.

                  모든 자료형은 type에 대한 포인트를 가진다.(4byte 고정)

 

포인터 변수의 선언

int * pnum1;                 - int *int형 변수를 가리키는 pnum1의 선언을 의미.

double * pnum2;          - double *double형 변수를 가리키는 pnum2의 선언을 의미.

unsigned int * pnum3;

                                    - unsigned int *unsigned int형 변수를 

   가리키는 pnum3의 선언을 의미.

 

 

변수의 주소 값을 반환하는 & 연산자

& 연산자의 피연산자는 변수이어야 하며, 상수는 피연산자가 될 수 없다. 변수의 자료형에 맞지 않는 포인터 변수의 선언은 문제가 될 수 있다.

ex)

int main()

{

        int num1 = 5;

        double * pnum = &num1; //일치하지 않음

}

 

int형 변수의 주소 값을 double형 포인터 변수에 저장하거나 double형 변수의 주소 값을 int형 포인터 변수에 저장하는 것은 잘못된 것이다. 비록 컴파일 에러는 발생하지 않지만 워닝이 뜬다.

 

포인터가 가리키는 메로리를 참조하는 *연산자.

ex)

int main()

{

    int num=10;

    int * pnum=#              //포인터 변수 pnum이 변수 num을 가리키게 하는 문장

    *pnum=20;                         //pnum이 가리키는 변수에 20을 저장

    printf("%d", *pnum);          //pnum이 가리키는 변수의 주소에 있는 값을

                                             // 부호 있는 정수로 출력.

}

 (예제1)

 main1

 

Intel 뒤에서부터 들어가기 때문에 산술은 빠르지만 대소비교는 느리다. -Little endian

 

12

34

56

78

78

56

34

12

 

super 앞에서부터 들어가기 때문에 산술은 느리지만

대소비교(논리연산)는 빠르다. - Big endian

 

12

34

56

78

12

34

56

78

 

int main()

{

int iNum = 0x12345678;

unsigned char *p =

(unsigned char *)&iNum;

*p = 0xAA;

return 0;

}

unsigned 선언 시 FFFF..사라짐 양의 정수라서.



(예제1)



(문제1)

(문제2)

(예제2)

char형 1byte 한 칸씩 이동                                        short형 2byte 두 칸씩 이동


(예제3)

char형 1byte 한 칸씩 이동





20140318 - 포인터

c언어 2014. 3. 18. 17:14 Posted by Owen.K

메모리에서는

일반적으로는 1byte씩 놔두고 주소를 숫자로 메김.

특수적으로는 2~3byte씩 주소를 숫자로 메길 수도 있음.


포인터(&, *) - 메모리에 직접 접근이 가능.

<!--[if !supportEmptyParas]-->                              *는 주소를 캐스팅할 때나 값을 단항으로 쓸 때

&는 주소를 알아내는 연산자.

      

symbol table

Type(자료형)

Name(변수명)

Address(주소)

int

iNum

1000->12FF70(16진수)

int

iCnt

2000->12FF74(16진수)

<!--[if !supportEmptyParas]--> <!--[endif]-->

&변수명(주소나옴.)

<!--[if !supportEmptyParas]--> <!--[endif]-->

%08X - 16진수로 출력하고 빈자리는 0으로 채우고 8자리

<!--[if !supportEmptyParas]--> <!--[endif]-->

*((int *)0x12FF70) = 100;  -  0x12FF70이라는 주소를 (int *)로 주소상수로 캐스팅 시키고,

 그 주소로 이동하여, 100을 넣는다.(iNum = 100) 

(예시1)

(예시2)

symbol table

Type(자료형)

Name(변수명)

Address(주소)

int

iNum

12FF70(16진수)

int iNum = 100;

(int *(int형 주소상수다.))0x12FF70 = 100;        //warning 뜸, 주소상수(int *) = 정수상수

   //둘 다 상수라서,

float fNum = 2.2;                                           //마찬가지로 warning 뜸, 주소상수 = 정수상수 

(float *(float형 주소상수다.))0x12FF78 = 2.2    //둘 다 상수라서.


&iNum과 (int *)0x12FF74 - 같은 뜻이다.            //같은 위치를 나타내는 것.


(예시3)

symbol table

Type(자료형)

Name(변수명)

Address(주소)

int

iNum

12FF70(16진수)

int *

iP

12FF74(16진수)

int * - 주소값을 가진다.

int iNum = 0;

int * iP = &iNum;    이면


iP는 iNum의 주소값을 가지게 된다.(iP가 iNum을 가리킨다)



20140317문제 풀이

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3-15는 문제 의미를 파악 못하겠네요..ㅠ

다른건 나름 풀었슴다..케어 부탁드릴께요ㅠ

20140317-제어문(break, continue, switch)

c언어 2014. 3. 17. 16:51 Posted by Owen.K

조건에 따른 흐름의 분기

 

break;

continue; //반복문에 쓰인다. breakswhitch에서도 쓰인다.

 

break - 가장 가까이서 감싸고 있는 반복문 하나를 빠져 나오게 된다.

 

continue - continue문의 이후는 생략하고, 다시 실행을 하게 된다.




(예시1)

(예시2)

(예시3)

(예시4)

(예시5)

(예시6)

switch - switch로 들어온 값이 case에 해당하는지 여부를 확인하여, 값이 일치하는 경우

                   해당하는 프로그램 코드를 실행하는 조건문.

                   if문과 매우 유사한 성격이지만, 생김새는 조금 다름 숫자가 정해져 있을 때 유리함.

 

switch(정수형 변수)

{

case 정수(상수형) :

case 정수(상수형) :

}



 (예시1)

(예시2)

(예시3)



'c언어' 카테고리의 다른 글

20140319 - 포인터2 메모리 관련 표현법  (0) 2014.03.19
20140318 - 포인터  (0) 2014.03.18
20140314-제어문(반복문,분기문)  (0) 2014.03.14
20140313 제어문-반복문(while, do~while, for), 순서도  (0) 2014.03.13
2014/03/12  (0) 2014.03.12

20140314-제어문(반복문,분기문)

c언어 2014. 3. 14. 17:55 Posted by Owen.K

for - 반복문

for(초기식(한번만 수행); 조건식(반복); 반복식(증감식))

두 개이상 쓸 수 있음 두 개이상 쓸 수 있음

while문에서 for문으로

(예시1)

(예시2)

(예시3)

(예시4)

(예시5)

(예시6)

(예시7)

(예시8)

(예시9)


분기문 - 프로그램의 실행은 위에서 아래의 방향으로 명령문을 순차적으로 읽고

                  실행하는 것이 원칙이다. 분기문은 이런 프로그램의 제어 흐름을 조작하는

                  방법이다. 분기문은 조건에 따라 어떤 부분의 코드가 실행되거나 실행되지 않고 

      건너뛰게 한다.

 

if - 프로그램의 흐름을 원하는 형태대로 컨트롤 할 수 있게 프로그램의 유연성을 부여할 수 있게 하는 제어문 중에서 분기문이다.

 if순서도



if()

{

    참이면 실행, 거짓이면 건너뜀.

}

(예시1)


(예시2)

(예시3)

(예시4)

 

if~else - 독립적으로 사용되는 것이 아니라 키워드 if와 더불어 하나의 문장을 구성하는 형태로 사용. 고로 ifelse가 만나서 이루는 문장의 수는 둘이 아닌

하나이다.


(if~else 순서도) 

if()

{

        참이면 실행, 거짓이면

}

else

{

        거짓이면 else에서 실행

}

 (예시1)

if~else if - if~else문의 경우 두 개의 블록 중 하나를 선택해서 실행하는 구조였지만,

                            if~else if문은 셋 이상의 블록 중 하나를 선택해서 실행하는 구조이다.

                            조건에 걸릴 확률이 높은 순서로 해주는 게 시간적으로 더 빠르다.

(if~else if 순서도)

if(조건1)

{

        A

}

else if(조건2)

{

        B

}

else if(조건3)

{

        C

}

else if(조건4)

{

        D

}

else

{

        E

}

 (예시1)

 

 

조건 연산자 : 피 연산자가 세 개인 삼 항 연산자

                            if~else문을 대신할 수 있는 연산자로 잘 쓰지 않는다.

                            하지만 해석은 할 수 있어야 한다. 다만 문자들을 비교할 때는

                            코드자체가 줄어들기 때문에 효율적이다.


(조건) ? data1 : data2

조건이 참이면 data1이 반환되고, 조건이 거짓이면 data2가 반환 된다.


(예시1) 

(예시2)


문제 08-1[if~else문의 활용]

(문제1)

(문제2)

(문제3)

(문제4)


 



'c언어' 카테고리의 다른 글

20140319 - 포인터2 메모리 관련 표현법  (0) 2014.03.19
20140318 - 포인터  (0) 2014.03.18
20140317-제어문(break, continue, switch)  (0) 2014.03.17
20140313 제어문-반복문(while, do~while, for), 순서도  (0) 2014.03.13
2014/03/12  (0) 2014.03.12

제어문(C언어, JAVA) - 다른 언어에도 공용으로 사용되기 때문에 상당히 중요하다.

                  제어문 종류에서 반복문이 있다.

반복문 - while, do~while, for

while - 반복을 명령하는 문장.

(예시1)

(예시2)     

(예시3)

(예시4)


for - 반복을 위한 변수의 선언 및 초기화에 사용되는 초기식

반복의 조건을 검사하는 목적으로 선언되는 조건식

반복의 조건을 거짓으로 만드는 증가 및 감소연산하는 증감식

필수요소 3가지를 한 데 묶어 사용하는 반복문

(예시1)

(예시2)

(예시3)

while 중첩문 - while문 안에 while문이 포함된 상황을 뜻한다.

                                예를 들어, while(1)(1)안에 있는 while(2)(2)가 참일 동안 계속

                                루프하고, (1)로 나오고 나서, (2)가 참이면 루프하기 때문에

                                보통 (2)가 더 많이 루프한다.   

while(cur <10)

{                            

is = 1;

while(is<10)

{

is++;

}

cur++;

}

(예시1)


(예시2)



do~while - while문과 달리 반복조건을 뒷부분에서 검사한다.

                            처음부터 반복조건을 만족하지 못하면 반복영역을 한번도 실행하지 않는

                            while문과 달리, 반복영역을 최소한 한번은 실행하는 구조.

do

{

무조건 한번은 돌아감

}

while(조건);


(예시1)

(예시2)

(예시3)

(예시4)

(예시5)


순서도흐름도로써 순서도를 보고 언어로 작성할 수 있어야 한다.

수의 계산이나 문제 해결에 필요한 처리 순서를 알고리즘이라 하고, 알고리즘의 내용을 기호로 사용한 그림으로 알기 쉽게 나타낸 것을 순서도라 한다.


(예시1)


(예시2)

(예시3)


'c언어' 카테고리의 다른 글

20140319 - 포인터2 메모리 관련 표현법  (0) 2014.03.19
20140318 - 포인터  (0) 2014.03.18
20140317-제어문(break, continue, switch)  (0) 2014.03.17
20140314-제어문(반복문,분기문)  (0) 2014.03.14
2014/03/12  (0) 2014.03.12

2014/03/12

c언어 2014. 3. 12. 17:53 Posted by Owen.K