<연결 리스트>

동적자료형은 함수의 실행 중 메모리가 필요에 따라 할당되었다가 사용 후 시스템에게 돌려주는 자료형으로, 메모리 공간 사용의 효율성을 높일 수 있다.
동적자료 구조에는 몇가지가 있지만 그 중 가장 많이 사용되는 것이 연결리스트이다.
옆의 그림을 보자.
동적자료 구조에는 몇가지가 있지만 그 중 가장 많이 사용되는 것이 연결리스트이다.
옆의 그림을 보자.
Data라는 태그를 가진 구조체 안에 *next라는 포인터가 지정되어 있다.
그런데 그 포인터는 또 하나의 다른 구조체를 가지고 지니고 있다.
이처럼 연결리스트에서는 변수 자체가 이름을 갖는 것이 아니라, 포인터변수(참조변수)를 이용하여 간접적으로 접근한다.
그런데 그 포인터는 또 하나의 다른 구조체를 가지고 지니고 있다.
이처럼 연결리스트에서는 변수 자체가 이름을 갖는 것이 아니라, 포인터변수(참조변수)를 이용하여 간접적으로 접근한다.
for문을 넣어서 p의 값이 0이 될때까지의 값을 내어보았다.
←소스내의 for문이 p에 들어가는 변화를 나타내었다.
<void *>
타입을 가리지 않고 모든 주소를 저장한다.
하지만 메모리에 직접 접근하며 값을 넣을수 없다.
ex>vp는 void * vp = 0;으로 선언되었을때.
ip = vp;
*ip = 100; == *((int *)vp)=100;
왼쪽과 오른쪽이 똑같이 vp안에 100이란 값을 집어넣고 있다.
하지만 왼쪽은 컴파일을 할때 두번일하는 것이고 오른쪽은 캐스팅으로 바로 한번만에 vp안에 100을 넣을수 있다.
<전역변수>
k=10;이라 선언되기전에 printf값이 '0'이 나온걸 볼수있다.
여기서 전역함수의 값이 지정안되어서 메모리 할당영역중 Bss부분에 들어가있는데, Bss영역은 쓰레기값 대신 0으로 채워져 있어 변수가 초기화되지 않아도 0을 출력한다.
전역변수는 분활컴파일시 충돌이 일어날수있다. 그래서 헤더파일에..전역변수를 선언하게 되면 가져가는 main()와 다른 함수로 인해 충돌이 일어날수있다. 이럴경우 헤더파일에 extern int k(외부에 K를선언한다.K가 있다는 존재하에)를 선언하고 종속적인 함수에 다시 int k를 선언하면 사용할수있다. 그리고 분활컴파일시 각각 함수의 변수에 주소가있다 그래서 이함수안 변수끼리 주소가 같을수가 있다. 그래서 분활컴파일시 충돌이 일어날수가 있다. 그래서 LINKing에 기능중에 이 주소가 같아서 충돌을 피하게 하는 기능이 있다 이것을 주소의 재배치라고 한다.지금 우리가 사용하는 일반적인 C같은경우는 이런경우를 관대하게 넘어가지만 C++로 컴파일할경우 바로 링킹error가 나오게된다.
A.cpp 파일
|
gcc -c main.c : main.o 생성
gcc -c A.c : A.o 생성
gcc -o (원하는 파일명) main.o A.o : 파일명.exe 생성
실행이 된다. a.h에서 extern int k와 a.cpp에서 int k 때문에 실행이 가능하다 여기서 test()나 main()두함수중에 하나는 꼭 int k를 선언해야한다.
gcc -c A.c : A.o 생성
gcc -o (원하는 파일명) main.o A.o : 파일명.exe 생성
실행이 된다. a.h에서 extern int k와 a.cpp에서 int k 때문에 실행이 가능하다 여기서 test()나 main()두함수중에 하나는 꼭 int k를 선언해야한다.
