'language/C|C++'에 해당되는 글 11건

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

#include <stdio.h>

 

int main(void)

{

                  int num1=10, num2=20, num3=30;

 

                  int* arr[3]={&num1, &num2, &num3};

 


 

                  // 표현은 같은 표현

                  printf("%d \n", arr[0]);

                  printf("%d \n", *arr);

                 

                  //

                  printf("%d \n\n", arr);

                 

                  // 해당 주소들이 저장하고 있는 값을 출력

                  printf("%d \n", *arr[0]);

                  printf("%d \n", *(arr[1]));

                  printf("%d \n\n", *arr[2]);

                 

                  // 표현은 같은 표현

                  printf("%d \n", arr1[0]);

                  printf("%d \n", *arr1);

 

                  //

                  printf("%d \n\n", arr1);

                 

                  // 해당 주소들이 저장하고 있는 값을 출력, *arr1[0], 컴파일 되지만 실행 에러.

                  printf("%s \n", arr1[0]);          

                  printf("%s \n", arr1[1]);

                  printf("%s \n", arr1[2]);


 

                  // 

                  printf("%s \n", *arr1);

 


                  scanf("%d", &num1);


                  return 0;

}


#include <stdio.h>

 

int main(void)

{

                  int num1=10, num2=20, num3=30;

 

                  // 배열 이름 = 배열의  번째 요소 주소값

                  //---------------------------------------------------

                  // 포인터 (배열변수배열에 주소값을 저장

                  // arr이라는 배열 변수

 

                  // 포인터 배열.

                  int* arr[3]={&num1, &num2, &num3};


                  // 포인터 배열.

                      char a = 'A';

 

                      char* arr1[4] = {

                                                     "Fervent-lecture",

                                                     "TCP/IP",

                                                     "Socket Programming",

                                                     &a

                      };

 

                  //---------------------------------------------------

                  // 주소(arr[0]) 가리키는 값을 참조(*)

                  printf("%d \n", *arr[0]);

                  printf("%d \n", *arr[1]);

                  printf("%d \n\n", *arr[2]);

 

                  // *arr, arr[0] 동일한 표현  번째 요소 주소 

                  //---------------------------------------------------

                  printf("%d \n", *(*arr));

                  printf("%d \n", *arr);

                  printf("%d \n", &arr);

                  printf("%d \n\n", arr);

 

                  //---------------------------------------------------

                  printf("%d \n", &num1);

                  printf("%d \n", &num2);

                  printf("%d \n\n", &num3);

                 

                  printf("%d \n", arr[0]);

                  printf("%d \n", arr[1]);

                  printf("%d \n\n", arr[2]);

                  //---------------------------------------------------

 

                  //---------------------------------------------------

                  // *arr1[0], 컴파일 되지만 실행  에러.


                  // %d, %c  값을 받는 서식 문자이지만,


                  // %s  주소를 받는 서식 문자이므로,

                  // %s  값을 대입하면 에러가 발생한다.

 

                  printf("%s \n", arr1[0]);

                  printf("%s \n", arr1[1]);

                  printf("%s \n", arr1[2]);

                  printf("%s \n", *arr1);

                  //---------------------------------------------------


          // 즉, 올바른 서식 문자를 사용해야 제대로 출력된다.


          // 문자열이 아닌 문자 '값'의 경우, * 연산자를 사용해서 간접 참조한다는 것을 알려줘야 한다.


          printf("%s \n", arr1[3]);

          printf("%c \n\n", *arr1[3]);

                  //---------------------------------------------------

                  // C++의 system("pause");

                  scanf("%d", &num1);

                  return 0;

}




 





'language > C|C++' 카테고리의 다른 글

C언어 정리 2  (0) 2016.08.08
typedef  (0) 2016.08.06
FILE* fopen  (0) 2016.07.26
문자와 문자열 처리 함수  (0) 2016.07.25
데이터 상수화, 포인터 상수화  (0) 2016.07.21
블로그 이미지

saylin

,

C언어 정리 2

language/C|C++ 2016. 8. 8. 00:00
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

문자열 변수의 특징과 null 문자에 대한 이해


배열을 이용한 문자열 변수의 생성


char str[6] = "Hello";


문자열 길이보다 하나 더 길게 배열을 할당하는 이유는 문자열의 끝에 null 문자가 자동으로 삽입되기 때문이다.


null 문자는 문자열의 끝을 의미하고, '\0'은 null 문자를 의미한다. 

null 문자는 아스키 코드값 0에 해당한다.


null 문자가 포함되어 있지 않은 문자열은 문자열이 아니라 단순히 문자 배열이다.


char arr1[] = {'a', 'b', 'c'};           (이는 문자 배열)

char arr2[] = {'a', 'b', 'c', '\0'};    (이는 문자열)



포인터에 대한 이해


포인터는 메모리의 주소 값을 저장하기 위한 변수.


직접 접근(Direct Access) 과 간접 접근(Indirect Access)


포인터 변수 pA 앞에 * 연산자를 붙이면 포인터가 가리키는 메모리 공간에 존재하는 값을 참조한다는 뜻.

즉, pA가 변수 a의 주소값을 가리키고 있다면 a==*pA


포인터는 가급적 선언과 동시에 초기화를 시켜주는 것이 좋다.



포인터와 배열의 관계


배열의 이름도 포인터다. 단, 배열은 포인터 변수와는 달리 주소 값을 바꿀 수 없는 상수다.

따라서 배열 이름을 '상수 포인터'라고 한다.


배열 이름은 첫 번째 요소의 주소 값을 나타낸다.



포인터 연산


포인터는 제한된 형태의 연산이 가능하다. 즉, 포인터 연산은 포인터 값을 증가 혹은 감소시키는 연산만 가능하다.


*int 타입 포인터 변수 값을 1 증가시키면(++pA 혹은 pA++) 4 증가함과 동시에 증가된 위치의 주소값이 저장된다.

*char 타입 포인터 변수 값을 1 증가시키면(위와 마찬가지로) 1이 증가함과 동시에 증가된 위치의 주소값이 저장된다.


즉, 포인터 값을 1 증가 혹은 감소시키면 데이터의 자료형 크기만큼 증가 혹은 감소하며, 변경된 위치의 주소값이 저장된다.



arr[i] == *(arr+i)


포인터 arr이 가리키는 곳에서 i칸 건너편에 있는 요소의 값을 참조하라는 의미. 이 때, arr이 가리키는 곳은 고정되어 있다.

따라서, *(arr+i)는 arr[i]와 같이 사용할 수 있다.



#include <stdio.h>

 

int main(void)

{

                  int arr[3]={11, 22, 33};


      // int * ptr=&arr[0];  같은 문장

                  int * ptr=arr;

 

                  printf("%d %d %d \n", *ptr, *(ptr+1), *(ptr+2));

      

// ptr

                  printf("%d ", *ptr);  ptr++;

                  printf("%d ", *ptr);  ptr++;


                  printf("%d ", *ptr);  ptr--;

                  printf("%d ", *ptr);  ptr--;

                  printf("%d ", *ptr);  printf("\n");           

                  return 0;

}



문자열 상수를 가리키는 포인터


char str1[5] = "abcd";

char *str2 = "ABCD";


배열 str1이 저장하고 있는 문자열은 변수가 된다.

포인터 str2는 문자열 상수 "ABCD"를 가리킨다.


문자열 상수는 메모리 공간에 저장이 되면 그 순간에 문자열 상수의 주소 값을 반환한다.

따라서, char *str2 = "ABCD";의 경우와 같이 주소 값이 아닌 문자열 상수를 전달해도 이 문장은 성립한다.


똑같은 문자열을 선언하면 (문자열 상수는) 한번만 메모리 공간에 할당된다.


char *str1 = "ABCD";

char *str2 = "ABCD";


문자열 상수 "ABCD"는 동일한 메모리 공간에 할당되고, 따라서 str1, str2는 동일한 주소 값을 가리키게 된다.

이는 컴파일러가 메모리를 효율적으로 사용하기 위해 최적화(optimization) 과정을 거치기 때문이다.



포인터 배열


포인터 배열은 메모리 주소값을 저장할 수 있는, 즉 포인터를 요소로 지니는 배열이다.


int *arr1[10];


char* arr[3] = {

"Fervent-lecture", 

"TCP/IP",

"Socket Programming"

};


문자열 상수가 메모리 공간에 할당되고, 포인터 배열 arr은 문자열 상수의 주소 값을 받아 초기화된다.

이를 문자열 배열(char형 포인터 배열)이라고 표현하고, 여러 개의 문자열을 저장할 수 있는 특징을 갖는다.






'language > C|C++' 카테고리의 다른 글

포인터 배열과 문자열 배열  (0) 2016.08.08
typedef  (0) 2016.08.06
FILE* fopen  (0) 2016.07.26
문자와 문자열 처리 함수  (0) 2016.07.25
데이터 상수화, 포인터 상수화  (0) 2016.07.21
블로그 이미지

saylin

,

typedef

language/C|C++ 2016. 8. 6. 18:23
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

typedef 


이미 존재하는 자료형에 새로운 이름을 붙이기 위한 용도로 사용되는 키워드


ex)

typedef int INT;


int에 새로운 이름인 INT를 붙여준다.





'language > C|C++' 카테고리의 다른 글

포인터 배열과 문자열 배열  (0) 2016.08.08
C언어 정리 2  (0) 2016.08.08
FILE* fopen  (0) 2016.07.26
문자와 문자열 처리 함수  (0) 2016.07.25
데이터 상수화, 포인터 상수화  (0) 2016.07.21
블로그 이미지

saylin

,

FILE* fopen

language/C|C++ 2016. 7. 26. 07:29
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

fopen 함수 원형


#include <stdio.h>


FILE* fopen(const char *filename, const char* mode)


fopen 함수는 매개변수로 파일이름(의 문자열 배열), 입출력 모드(의 문자열 배열)을 받는다.

함수 호출 뒤, fopen 함수는 (포인터이므로) 각각의 정보에 대한 주소값을 리턴한다.


즉, 메모리 공간 상에 존재하는 파일이름 정보가 저장된 메모리 주소와 

입출력 모드 정보가 저장된 메모리 주소값을 리턴한다.



파일을 불러들일 경우, 


FILE* f = fopen("c:\test.txt", "rt")


FILE 구조체 변수를 선언할 때 포인터 변수를 선언하는데, 그 이유는 fopen 함수가 주소값을 리턴하기 때문. 



'language > C|C++' 카테고리의 다른 글

C언어 정리 2  (0) 2016.08.08
typedef  (0) 2016.08.06
문자와 문자열 처리 함수  (0) 2016.07.25
데이터 상수화, 포인터 상수화  (0) 2016.07.21
SwitchViewDemo  (0) 2016.06.06
블로그 이미지

saylin

,