필자는 군대 다녀온 후 c언어를 포맷해버렸기 때문에, 시스템 프로그램을 학습하기 위해서는 c의 기본이자 핵심인 포인터를 따로 학습하며 기억하려고 이렇게 포스팅 하게 되었습니다.
(참고)필자가 누차 적는 데엔 그만큼 중요해서 아는 것은 더욱 확실하게 외워두고, 모르는 것은 적으면서 외우려고 하는 것입니다.
百聞而不如一作 == 백문이 불여일타
int main(void)
{
int i = 10;
char c = 69;
float f = 12.3;
}
(참고로 포인트 변수는 4바이트 정수)
int i= 10;
int*p;
p= &i;
printf("*p= %d\n", *p);
(역시 C는 어렵다. 역시 포인터다. 그치만 해야만한다....)
#include <stdio.g>
int main(void)
{
int i = 10;
int *p;
p= &i;
printf("i= %d\n", i);
*p =20; //주소로 접근
printf("i= %d\n", i);
return 0;
}
변수와 상수의 차이는 ? (나의생각)
변수란 네모난 박스 안에 집어 넣는, 공간을 만들어서 넣는, 즉 가변성 있다.
상수는 정해진 일정한 값. Int i= 10; 이렇게
#include <stdio.h>
int main(void)
{
int a[]= {10,20,30,40,50};
printf("a=%p\n",a); // %p는 주소출력임
printf("a + 1 = %p\n", a+1);//+1을 하면 자료형의 크기만큼 옮겨짐(자료형은 4바이트)
printf("*a= %d\n", *a);
printf("*(a+1) = %d\n", *(a+1));
return 0;
}
#include <stdio.h>
int main(void)
{
int a[3]={10,20,30};
int *p; //정수 값 가리키는 포인트
p = a;
printf("a[0] =%d, a[1] = %d, a[2] = %d\n", a[0], a[1], a[2]);
printf("p[0] =%d, p[1] = %d, p[2] = %d\n", p[0], p[1], p[2]);
return 0;
}
int main(void)
{
...
};
int main (int argc, char *argv[])
{
...
};
이 두개는 동일하며, 배열 = 포인터로 교체 가능.
char * argv[];
char ** argv;
또한, 외부에서 입력받는 int argc, char argv[])의 char argv[] 는
1. ls 만으로는 안돼서
2. ls -l 이나
3. ls -l/usr
mycopy src dst
=> 인자의 갯수 3개, 1번 mycopy 2번 src 3번 dst
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
for(i = 0; i < argc; i++)
printf("argv[%d] = %s\n", i, argv[i]);
return 0;
}
int i = 10; // i : 정수형 변수
int *p = &i; // p : 변수 i를 가리키는 포인터
int **q = &p; // q : 포인터 p를 가리키는 포인터
#include <stdio.h>
int main(void)
{
int i = 100;
int *p = &i;
int **q = &p;
*p = 200;
printf("i=%d *p = %d **q = %d\n", i, *p, **q);
**q = 300;
printf("i= %d *p =%d **q =%d\n", i. *p, **q);
return 0;
}
(결과 값)
i = 200, p = 200, **q = 200
i = 300, p = 300, **q = 300
char fruits[4][10] = {
"apple","bluberry","orange","melon"};
char *fruits[] = { // 문자형 포인터 배열
"apple","bluberry","orange","melon"};
#include <stdio.h>
int main(void)
{
int i;
char *fruits[4] ={"apple","bluberry","orange","melon"};
for(i=0; i<4; i++)
printf("fruits[%d] = %s\n", i, fruits[i]);
return 0;
}
#include <stdio.h>
int main(void)
{
int m[3][3] = {10,20,30,40,50,60,70,80,90};
printf("&m[0][0] = %p\n", &m[0][0]);
printf("&m[1][0] = %p\n", &m[1][0]);
printf("&m[2][0] = %p\n", &m[2][0]);
printf("m[0] = %p\n", m[0]);
printf("m[1] = %p\n", m[1]);
printf("m[2] = %p\n", m[2]);
printf("m = %p\n" , m);
return 0;
}
포인터란,
+1, -1 코드를 작성할 때, 단순히 연산하는 +,-가 아니라 인덱스 배열의 크기만큼 +,- 한다는 의미입니다.
또한, 포인터의 해석은
1) 한 행을 볼 것인지 2) 한 행(구간) 별 원소 개수를 볼 것인지
로 나뉩니다.
참고로, 쉘 프로그래밍에서 readonly 를 사용하면, 뒤에 변수가 상수가 됩니다.
(변수의 상수화 라고 합니다)
#include <stdio.h>
int main(void)
{
char s[] = "Barking dogs seldom bite.";
const char *p = s;
printf("p = %s\n", p);
p[3] = 'a'; //p가 가리키는 곳의 내용을 변경하지 못함.
printf("p = %s\n", p);
return 0;
}
이대로 컴파일하게 된다면 실행되지않습니다. 왜냐하면 p[3] ='a';
이 부분 때문입니다. p[3] ='a'
을 빼게 된다면 정상 작동하는 것을 확인할 수 있습니다 (참고)