티스토리 뷰

[29,30강] 2차원 배열과 포인터

 

* 배열 : 물리적으로 연속 된 공간

*이차열 배열은 행의 대표 주소를 가지고 있다.

  배열 배열
저장소
저장소에 등록 된 주소 주소
int a[3][2] = {{1,2},{3,4},{5,6}}; a  →  a[0] → a[0][0]  1행1열 1 100번지
3행 2열짜리 배열 a 생성     a[0][1]  1행 2열 2 101번지
    a[1] → a[1][0]  2행 1열 3 102번지
      a[1][1]  2행 2열 4 103번지
    a[2] → a[2][0]  3행 1열 5 104번지
      a[2][1]  3행 2열 6 105번지
printf("%d\n", a) a에는 a[0]의 주소값 저장 → 100번지 출력
printf("%d\n", *a) a에 주소값 에있는 a[0]에는 a[0][0]의 주소값 저장 → 100번지 출력
printf("%d\n", **a) a에 주소값 에있는 a[0]에 있는 a[0][0]의 주소의 값 → 1 출력

 

* 예시(1)

int data[ ][3] = {1,3,4,5,2,9,6,8,7}; 3열 배열 data 생성 data
(100번지)
1열 2열 3열
    data [0] 1행
(100번지)
1
(100번지)
3
(101번지)
4
(102번지)
int *p = data[1]; p →
(103번지)
data [1] 2행
(103번지)
5
(103번지)
2
(104번지)
9
(105번지)
int x,y;   data [2] 3행
(106번지)
6
(106번지)
8
(107번지)
7
(108번지)
x= *p; 103번지의 값
x = 5
       
y = *(p+2); 105번지의 값
y = 9
       
printf("x=%d, y=%d\n", x, y)        x = 5, y = 9

 

* 예시(2)

int darr[3][3] ={{1,2,3},{4,5,6},{7,8,9}}; 3행 3열 darr darr
100번지
1열
darr[ ][0]
2열
darr[ ][1]
3열
darr[ ][2]
int sum1, sum2;   1행 100번지
darr[0][ ]
1
(100번지)
2
(101번지)
3
(102번지)
sum1=*(*darr+1) + *(*darr+2); *(100번지+1)+
*(100번지+2) = 2+3 = 5
2행 103번지
darr[1][ ]
4
(103번지)
5
(104번지)
6
(105번지)
sum2=*darr[1]+*darr[2]; 103번지의 값 4
+106번지의 값 7 =11
3행 106번지
darr[2][ ]
7
(106번지)
8
(107번지)
9
(108번지)
printf("%d,%d, sum1, sum2); 5,11 출력        

 

[31,32,33,34강] 포인터 배열

* 포인터 배열이란? 배열의 요소가 포인터(메모리주소)로 이루어진 것

* %s는 주소값을 받아서 null이 나올때까지 출력

char a[3] = {'a','b','c'}; a → 100번지 a[0] a 100번지
    a[1] b 101번지
    a[2] c 102번지
printf("%s\n", a);  100번지의 문자열(%S)을 출력
*** null을 만날 때 까지
→ abc출력
  null  

 

* 예시(1)

char *c[ ] = {'aaa','bbb','bbb' }; c → 100번지 100번지 20번지
100번지
30번지
101번지
40번지
102번지
    20번지 a a a
    30번지 b b b
    40번지 c c c
printf("%s", *(c+1)); c   100번지
c+1 → 101번지
*(c+1) →101번지의 값   주소값 30번지, %s는 주소값의 문자열을 출력(null전까지) bbb

 

* 예시(2)

char *array1[2] =
{"Good morning", "C language" };
array1 → 100번지 20번지
array1 [0]
50번지
array1 [1]
    20번지 G o o d   m o r n i n g
    50번지 C   l a n g u a g e    
printf("%s"\n, array1[0]+5); morning                          
printf("%c"\n, *(array1[1]+6)); u                          

* %s는 주소값을 받아서 null이 나올때까지 출력

 

* 예시(3)

int a[2][3]=
{{-3,14,5},{1,-10,8}};
a→100번지      
int *b[ ] = {a[0],a[1]}; 100번지
a[0] 
-3
100번지
14
101번지
5
102번지
int *p=b[1]; 103번지
a[1]
1
103번지
-10
104번지

8
105번지
  b → 200번지 100번지 103번지  
  p →   103번지      
printf("%d", *b[1]); 103번지의 값 1
printf("%d", *(++p)); p+1 →   104번지의값 -10
printf("%d", *(--p-2)); p-1 → 103번지 -2   101번지의 값 14 

 

* 예시(4)

int *arr[3]; arr → 100번지 arr[0] 10번지 100번지
int a = 12, b=24, c=36;   arr[1] 20번지 101번지
arr[0] = &a;   arr[2] 30번지 102번지
arr[1] = &b;   a 12 10번지
arr[2] = &c;   b 24 20번지
    c 36 30번지
printf("%d\n", *arr[1]+**arr+1); 20번지의 값 24 + 100번지의 값 10번지의 값 12 + 1 = 37

 

[35강] 구조체, 포인터 이동

* 구조체란? 여러 변수들을 모아서, 하나의 객체를 구성할때 사용하는 사용자 정의 타입 객체

구조체 정의 후 사용 정의와 동시에 인스턴스 생성 포인터에 담음
. 대신 -> 사용
struct 구조체명
{
   멤버변수 1;
   멤버변수 2;
}
struct person
{
  char *name;
   int age;
};

struct person user1;
user1.name = "h  user";
printf("%s", user1, name);
struct person 
{
  char *name;
  int  age;
} test;
test.name = "h user";
test.age = 40;
printf("%s : %d", test.name, test.age);
struct person 
{
  char *name;
  int  age;


struct person *p;
p -> name = "test_2";
p -> age= 40;
printf("%s : %d", p->name, p->age);

 

*예시 

문제 풀이
struct list {
   int *fp
} data, *p
int x[] = {100,200,300,400};
p= &data;
p->fp= x+1;
printf("%d", *(++p->fp));
data(100번지)  : fp 가짐
p  → 100번지 
x → 200번지 
p안에 있는 fp → data(100번지)안에있는 fp에 x+1에 201번지 주소 대입
++p → 101번지 → fp의 값
구조체이기때문에, (p->fp)얘가 하나의 변수임
따라서 ++(p->fp)이므로
p->fp 201번지 +1 = 202번지의 값 300출력

 

[36강] 배열 포인터

* 배열포인터란? 배열의 시작 주소값을 저장할 수 있는 포인터의 2차원 배열의 구조.  그냥 하나의 포인터일 뿐이다.

  포인터인데 배열. 자기가 다시 잘라서 재조합함(논리적으로)

int (*in)[2];  in이라는 포인터를 만들건데 어떤 구조가 들어오던 2개씩 자를거야
int num[3]={1,2,3}; num → 100번지   1
100번지 
2
101번지
3
102번지
in = num in
100번지
100번지
in[0]
1
100번지
2
101번지
 
    101번지
in[1]
3
102번지
   
printf("%d\n", in); 100번지        
printf("%d\n", num); 100번지        
printf("%d\n", *in); 100번지의 값은 in[0]
이므로 100번지
       
printf("%d\n", **in); 100번지의 값 1        

 

※ 출처 : 흥달쌤 C언어 29강~36강 https://youtu.be/wg4j5dtAP1E?si=PO9s7NFFc_W6S53l

※ 컴파일 사이트 : http://ideone.com

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함