본문 바로가기

컴퓨터 과학 & 영상처리 관련/자료구조 / 알고리즘

Data Structures Using C module 815 - 요약

objective 1 string

문자열의 끝에는 NULL 문자가 들어가야함
널문자에는 NULL,0,*0,'\0' 등이 사용될 수 있음
(int*)0 과 같이 사용되는건 문자열에 말고 실제 널포인터 가

리킬때쓰는듯
strcpy,strcmp,strcat 함수에 대한 소개
strcpy(str1,str2);  //str2의 시작주소부터 NULL이 나올때까

지의 문자열을 str1의 시작주소에부터 복사

strcmp(str1,str2); //lexicographical order에 따라

str1,str2의 첫번째 문자부터 차례대로 비교함. 'A'가 'Z'보

다 작음. ASCII 코드 상으로 보면 'A'가 65,'Z'가 90임.

ASCII코드상으로 'a'가 97로 'Z'보다 큼

strcat(str1,str2); //str1의 NULL부터 str2를 이어다가 붙히

는데 str2의 NULL문자까지임


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char* test1 = "_test1";
    char test2[5];
    char test3[5];
    char test4[5];
    char test5[5];
   
    test2[0] = 'a';
    test2[1] = NULL;
    test2[2] = 'b';
   
    test3[0] = 'a';
    test3[1] = 0;
    test3[2] = 'b';
   
    test4[0] = 'a';
    test4[1] = '\0';
    test4[2] = 'b';
   
    printf("test2 + test1 = %s%s\n",test2,test1);
    printf("test3 + test1 = %s%s\n",test3,test1);
    printf("test4 + test1 = %s%s\n",test4,test1);    
   
    getchar();
    getchar();
    return 0;
}

프로그램 출력 결과
test2 + test1 = a_test1
test3 + test1 = a_test1
test4 + test1 = a_test1

 

 

objective 2 array

배열은 연속된 데이타임...스트링은 케릭터 배열이다...함수에 인자로 전달될 때

배열의 시작주소를 전달 가능하고 그걸로 수정가능...콜바이벨류

콜바이레퍼런스...대신 키워드를 써서...수정못하게도 가능...다차원 배열 사용가

능...인덱스로 인트나 케릭터가 올 수 있다...인덱스는 레인지를 벗어나지 않아야

된다...배열의 원소가 인덱스로 올 수도 있다

 

 


 

objective 3 pointers

포인터는 주소이다
변수에 & 써서 주소값을 얻을 수 있다
int a = 10;
int *b = &a;

주소에 *를 써서 주소안의 내용을 알 수 있다
int a = 10;
int *b = &a;
printf("%d",*b); // 10


int* a1, *a2, *a3 ,a4 = 10;
a1 = &a4;
a3 = a2 = a1;
이러면 포인터 세개가 같은곳 가리킴(a4)

포인터는 선언시 타입(int, double, char)을 명시해야함
1,4,8바이트 각각 자료형은 사용하는 메모리 공간이 다름
포인터 자체는 4 바이트
사용할 때 형변환이나 void* 같은걸로 다르게 접근할 수 있긴함

배열은 메모리상의 연속된 저장공간이고
포인터는 그냥 메모리의 주소임
대신 주소를 알면 그걸 통해서 다음주소나 이전 주소를 계산 가능하니 배열처럼 사용 가능

함수에 인자를 줄 때 보통 값복사를 해서 주는데
포인터는 주소정보를 값복사해서 주므로 그걸로 배열과 같이 주소정보 활용 가능
다음과 같은 코딩도 가능함

#include <stdio.h>

int func(int a[])
{
    a[0] = 10;
}

int main(void)
{
    int a = 5;
   
    func(&a);

    printf("%d",a);     //결과값 10
   
}


함수 안에서 지역변수로 포인터를 할당하고 포인터를 리턴할 때는 함수가 종료되고 스택안의 메모리가 다 없어질 수 있으니 동적할당 등을 사용하여 하는게 나음