'예전것/프로그래밍'에 해당되는 글 14건

  1. 2009.06.25 포인터 세번째, 여러가지 포인터 비교
  2. 2009.06.23 포인터와 함수.
  3. 2009.06.23 C 포인터 와 scanf buf에 대해
  4. 2009.06.19 C포인터와 little, big endian
예전것/프로그래밍2009. 6. 25. 18:56

1. int *np
 - int형 포인터 변수로 4byte이고 int형 주소를 저장.
2. int **npp
 - 2차원포인터 변수로 4byte이고 1차원 포인터 변수의 주소를 저장
3. int arr[3]
 - int형 배열로 int 형 메모리 3개를 갖는 12 byte 메모리이다.
4. int arr[2][3]
 - 2차원 배열
5. int *arr[3]
 - int형 주소를 3개까지 저장하는 배열로 각 배열요소(arr[0] , arr[1] arr[2]) 가 int형 주소를 저장.
6. int (*arr)[3]
 - arr은 포인터 변수로 4byte이며 2차원 배열과 같은 열의 개수가 [3]인 int형 배열의 시작주소를 저장하기 위해 사용된다. 포인터 변수이므로 4byte이다.
 사용 예)

#include < stdio.h >
void main()
{
int arr2[2][3] = {{10,20,30}, {100,200,300}};
            int (*arr)[3];

arr = arr2;
            
 }
arr[0][0] ~ arr[1][2] 로 값 접근이 가능하다.

7. int (*arr)[2][3]
 - arr은 3차원 배열의 주소를 저장하기 위한 포인터 변수로 행과 열의 개수가 [2][3]인 int형 3차원 배열의 주소를 저장한다. 포인터 변수이므로 4byte

사용 예)

#include<stdio.h>
void main()
{
     int arr3[2][2][3]={{{10,20,30,{40,50,60}},{{70,80,90},{100,110,120}}};
     int (*arr)[2][3];
   
     arr = arr3;
}
arr[0][0][0]  ~ arr[1][1][2]로 접근이 가능하다

8. int (*arr[2])[3]
 - 같은 변수를 배열로 2개 선언한 것이다. 배열요수 (arr[0], arr[1])은 열의개수가 [3]인 int형 2차원 배열의 시작 주소등을 저장한다.

int iarr1[2][3] = {{21,22,23}, {24,25,26}};
int iarr2[3][3] = {{31,32,33}, {34,35,36}, {37,38,39}};

arr[0] = iarr1;
arr[1] = iarr2;

이렇게 해서
arr1[0][0][0] ~ arr[0][1][2] 까지 iarr1이되고
arr[1][0][0] ~ arr[1][2][2] 까지 iarr2가된다..

9. int *(*arr)[3] - 2차원 배열의 주소를 저장하는 포인터

int n1 = 10, n2=20,n3=30,n4=40,n5=50,n6=60,n7=70,n8=80,n9=90;
int *iarr1[2][3] = {{&n1,&n2,&n3}, ,{&n4,&n5,&n6};
int *iarr2[3][3] = {{&n1,&n2,&n3}, {&n4,&n5,&n6}, {&n7,&n8,&n9}};
int *(*arr)[3];

arr = iarr1; //여기서는 arr이 iarr1의 값에 *arr[0][0] ~ *arr[1][2]이렇게 접근가능..

arr = iarr2; //여기서는 arr이 iarr1의 값에 *arr[0][0] ~ *arr[2][2]이렇게 접근가능.. 배열은 주소를 저장하고있다.
10. int *func(); - int의 주소를 반환한다는 뜻..

#include<stdio.h>
int n =20;
int* func()
{
    return &n;
}
void main()
{
   int *np;
   np = func();

   printf("%d %d\n", n, *np);
}

11. int (*func)()
#include<stdio.h>
int function1()
{
   puts("함수 1입니다.");
   return 1;
}
int function2()
{
   puts("함수 2입니다.");
   return 2;
}
void main()
{
   int (*func)();
   
   func = function1;
   printf("%d\n", func());
   func = function 2;
   printf("%d\n", func());
}
func는 포인터 변수로 4byte이며 함수의 주소를 저장한다.

12. int (*func[2])()
 - 함수의 주소를 저장하는 배열로 크기가 2라서 8byte(정수형)이며, 각배열의 요소 func[0] func[1]는 함수의 주소를 저장한다.
#include<stdio.h>
int function1()
{
   puts("함수 1입니다.");
   return 1;
}
int function2()
{
   puts("함수 2입니다.");
   return 2;
}
void main()
{
    int (*func[2])();
   
    func[0] = function;
    printf("%d\n",func[0]);
    func[1] = function;
    printf("%d\n", func[1]);
}





 
예전것/프로그래밍2009. 6. 23. 09:35

출력하고자 하는것
함수 호출 : 1
함수 호출 : 2
함수 호출 : 3

#include<stdio.h>

char* getstr();

void main()
{
 puts( getstr());
 puts( getstr());
 puts( getstr()); 
}

char* getstr()
{
 static int n = 1;

 char *x = "" ;

 printf("함수 호출 : %d", n++);

 return x;
}


 getstr함수에서 정적 변수를 선언해서 호출 할때마다 n이 증가하도록 함.

헷갈렸던것

char *x = ''; 이것은 에러가 난다. ''은 빈문자 '상수' 이기때문이다. 주소를 가리켜야한다. 그러기위해선 "" 를 써서 빈문자를 나타내는 주소를 가리키게한다.

char x = ""; (char x = '';은 상수이기 때문에 return 상수; 하는 꼴이다.)
하고
return &x 로 바꾸면 어떤 문제가 생길까?

-일단 char x= ""; 이렇게 선언한다는것 자체가 문제이다. 상수형 변수에 주소를 넣겠다는 생각인가.
이때 &x는 뭐 그냥 주소값인데 아무것도 의미하지않는다.



getstr함수에서 문자자체를 넘겨주는 방법을 생각할 수있겠다(printf없이..) 스트링함수의 append를 쓰면 될거같다...

예전것/프로그래밍2009. 6. 23. 00:22
#include<stdio.h>

int main()
{
    char *str;
    
    scanf("%s", &str);
    printf("%s\n", &str);
}

위 프로그램을 실행 했을때 돌아간다.
str이 포인터 변수이지만 scanf에서 &str로 그 변수 안에 값을 써버린다.
그래서 printf해도 값이 나오는것이다. 물론 abc같은 짧은 문자를 쓰면 오류가 안나는데 adlkfasjd;lkfjasd같이 길게 쓰면 오류난다. (동적이 아니다. 이건 정적이라고볼수 있겠다.)

이경우에 우리는 *str을 이용하기 위해서 malloc 이라는 함수를 사용한다. char *str이 아무것도 가르키고 있지 않기 때문에 현재는 쓰레기 값이다. 그래서 malloc함수를 이용해 어느 한곳을 지정해준다.

#include
int main()
{
char *p;
p = (char*)malloc(20);
scanf("%s", p);
printf("%s", p);
free(p);
return 0;
}


#include
int main()
{
char p[20];
scanf("%s", p);
printf("%s", p);
return 0;
}
포인터 변수는 말그대로 어떤 주소값을 가리키고 있다.
그리고, 이 주소값이 가리키는 메모리영역에는 scanf로 받아들인 데이터를
저장하기 위한 어느정도의 공간이 할당되어야한다.
메모리를 잡아주어야한다.
예전것/프로그래밍2009. 6. 19. 17:05

(char*)&c == &c
c가 char형일때 위와같다. (char*)는 char형으로 주소 형변환을 하겠다는 의미이다.
(char*)&c +1
(int*)&c +1
은 다른 결과를 나타낸다. int형주소에 정수를 더하면 4byte씩 증가하고 char형은 1byte씩증가한다.


예제1
int n = 0x11223344;

printf("%x\n", *(char*)&n);
printf("%x\n", *(short*)&n);
printf("%x\n", *(int*)&n);

이 예제의 결과

44
3344
11223344

윗줄 프린트문에서 (char*)로 주소 형변환을 하였다. &n은 int형 주소지만 (char *)에 의해 char형으로 형변환이 된다. 이때 1byte의 공간을 * << === 가리키는 값은 44 (n에 저장된값은 16진수이다. 따라서 뒤에 두자리만.)
이렇게 메모리에 저장하는 방식을 little_endian이라한다.
44
33
22
11
메모리에 이렇게 저장함.