const int * ptr  = #

                                             >>>>>>>>  const int * const ptr = #

int * const ptr = # 


위와 같이 두 가지 선언을 동시에 할 수 있다.


WRITTEN BY
CIP_Pooh

,
1
2
3
4
5
6
int main(void)
{
    int num;
    scanf("%d" , &num);
 
}



scanf 함수 내에서 외부에 선언된 변수 num에 접근 하기 위해서는 num의 주소 값을 


알아야 한다. 그래서 scanf 함수는 변수의 주소 값을 요구한다.


1
2
3
4
5
6
int main(void)
{
    char str[10];
    scanf("%s" , str);
 
}



위 코드와 같이 배열 이름 str앞에 & 연산자를 붙이지 않는 이유는


str은 배열의 이름이고 그 자체가 주소 값이기 때문에 & 연산자를 붙이지 않는다.


str을 전달함은 scanf 함수 내부로 배열 str 주소 값을 전달하는 것이다.


WRITTEN BY
CIP_Pooh

,

int * param = int param[]


둘은 같은 선언이다.


WRITTEN BY
CIP_Pooh

,

Call-by-value 란?


- 함수를 호출할 때 단순히 값을 전달하는 형태의 함수호출을 말한다.

- 함수 외부에 선언된 변수에 접근이 불가능하다.


EX)


1
2
3
4
5
void callbyvalue (int num)
{
    if(num<=0)
        return;
}





Call-by-reference 란?


- 메모리의 접근에 사용되는 주소 값을 전달하는 형태의 함수호출을 말한다.

- 외부에 선언된 변수에 접근이 가능하다.


EX)


1
2
3
4
5
6
7
void callbyreference (int * param, int n)
{
    int i;
    for(i=0; i<n; i++)
        printf("%d ", param[i]);
    printf("\n");
}






WRITTEN BY
CIP_Pooh

,
1
2
3
4
5
6
7
8
9
10
11
12
int sample(int num)
 
int main(void)
{
    int num = 10;
    sample(10);
 
    - - - - - - - 
}
 
 
 



위에 보이는 코드와 같이 , 배열을 함수의 인자로  전달하려면 배열을 통채로 복사할 


수 있도록 배열이 매개변수에 선언되어야 한다.


But C언어에서는 매개변수로 배열의 선언을 허용하지 않는다.



WRITTEN BY
CIP_Pooh

,

1. 주소값을 변수에 저장하지 않고 포인터 변수라는 것을 선언해서 저장 하는 이유?

  - 변수에는 내가 가리키는 메모리에 대한 정보가 없다.

  - 포인터에는 내가 가리키는 메모리에 대한 정보가 있다.

 

2. type에 따라 그 type에 맞는 포인터 변수를 선언해서 저장해야 되는 이유?

  - 해당 type을 가리킨다는 정보가 해당 type 포인터 (ex) int *)이기 때문이다.

 

(출처 : 윤성우의 열혈 C 프로그래밍 중에서..)

 

 


WRITTEN BY
CIP_Pooh

,

- 파이썬은 인터프리터 언어이다.

 

- 파이썬은 사람이 생각하는 방식을 그대로 표현할 수 있는 언어이다.

 

- 파이썬은 문법이 쉬워 빠르게 배울 수 있다.

 

- 파이썬은 간결하다.

 

 

오늘은 파이썬의 특징과 사칙연산(+,-,*,/) , 자료형(숫자형)에 대해 공부해봤다.

 

C를 조금 공부해본 나로써는 C에서는 사칙연산을 하려면 line 수가 몇줄이나 되지만 파이썬에서는 단 한줄로만으로도

 

결과물을 얻을 수 있어서 좋은 것 같다. 오늘 연등은 여기까지 하고 월요일 쯤 나머지 자료형들에 대해서 공부를 해볼 예정이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*참고 : 점프 투 파이썬


WRITTEN BY
CIP_Pooh

,

리눅스 C 소스 코드를 보던 중 제목과 같이 main 함수를 선언한 것 을 보고 궁금해서 구글링을 통해 찾아보았다. 상식으로 알고 있고 자 정리를 해보려고 한다.


1
int main(int argc, char *argv[])



main 함수에 대해서는 따로 설명하지 않겠다.

다만 argc , argv가 무엇인지에 알아보자.

c에서 argc는 매개변수 개수가 들어가게 되고, argv에는 매개변수 값이 들어간다.

예를 들어 실행파일을 aaa, bbb, ccc 이렇게 실행되면 argc에는 3이 argv[1]에는 bbb가 argv[2]에는 ccc가 들어가게 된다.

이것을 통해 입력된 매개변수를 알아내어 프로그램에서 사용할 수 있는 것이다.



WRITTEN BY
CIP_Pooh

,

사용법

1
2
3
4
#include <string.h> 
 
char * strcat ( char * destination, const char * source );
char * strcat ( char * destination, const char * source );
cs


설명

destination 끝에 source를 덧붙인다.

이때, destination 의 맨 마지막 Null 문자는 source 의 첫 번째 문자가 덮어 씌우게 된다.

그리고, source 의 마지막 Null 문자가 destination 끝에 붙어서 새로운 문자열을 형성하게 된다.

예를 들면, destination = "hello"이고, source="world"였다면 strcat 후, destination 은 "helloworld" 가 된다.

strncat의 경우 strcat과 마찬가지로 2개의 문자열 인수를 받아 1개의 문자열로 만든다.

단, strncat의 경우 복사할 src 문자열 중에 앞에서 몇 번째까지 붙여 넣을지 지정할 수 있다.


주의해야 할 점은 합쳐진 문자열을 첫 번째 인수의 포인터 배열에 저장된다는 것이다. 그러므로 첫 번째 인수의 포터나 배열은 합쳐진 문자열 크기만큼의 메모리를 확보해야 한다. 즉, 첫 번째와 두 번째 인수의 문자열 크기를 확인하고 새로운 메모리를 확보하여 합쳐진 문자열을 넣지 않는다는 뜻이다.

strncat는 첫 번째 인수의 메모리에서 '\0'을 찾아 그 부분부터 2번째 인수의 문자열의 문자를 지정한 개수만큼 차례로 복사해 나간다.

예제(strcat)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
 
int main (void)
{
 
    char str[25];
 
    strcpy(str,"Hello ");
    strcat(str,"World");
    printf(str);
 
    return 0;
}
 
cs


예제(strncat)

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <string.h>
 
int main( void)
{
   char  str[20= "hello";
                   
   printf"%s\n", strncat( str1, " world!"7));
 
   return 0;
}
cs


'programming Language > [C] 함수정리' 카테고리의 다른 글

[strcpy&strncpy]  (0) 2016.01.09

WRITTEN BY
CIP_Pooh

,

사용법

1
2
3
4
#include <string.h>
 
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
cs


설명 

src 가 가리키는 문자열을 dest 가 가리키는 배열에 복사한다. src에서 복사될 때 '\0'까지 복사됨으로 문자열이 겹쳐지지는 않는다. 이때 dest는 src를 모두 복사 받을 수 있을 정도로 충분히 커야 한다.

strcpy()는 목적지의 배열의 크기가 충분히 크지 않을 경우 어떤 일이 발생될지 알 수가 없다.

예를 들어 버퍼 오버 플로 기법에 매우 취약하다. strcpy()를 쓰기 전에는 반드시 복사할 문자열의 크기를 검사하거나 strncpy()를 써야 한다.

strncpy()는 문자열의 크기를 정할 수 있으므로 버퍼 오버 플로에 좀 더 안전하다. 

주의할 점은 strncpy 함수는 null 문자를 추가하지 않기 때문에 buffer 크기-1만큼을 주어야 한다.

만약 src의 길이가 n 보다 작다면 dest의 남는 공간은 null로 채워진다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char buf[20];
 
    strcpy(buf, "buffer overflow");
    printf("%s\n", buf);
    strncpy(buf, "buffer overflow"sizeof(buf)-1;
    printf("%s\n", buf);
}
        
cs


'programming Language > [C] 함수정리' 카테고리의 다른 글

[strcat&strncat]  (0) 2016.01.09

WRITTEN BY
CIP_Pooh

,