22.3.04レビュー


c
ポインタ:メモリ内のデータ・アドレス値を格納する変数
/* 사용방법 */
int* p; // (주소값이 저장되는 데이터의 형태)* (포인터의 이름)
int *p; // (주소값이 저장되는 데이터의 형태) *(포인터의 이름)
ポインタの値を格納するためにデータが必要なアドレス
&a  // &(주소값을 계산할 데이터)
上記のように使用
&演算子を使用して、特定のデータのメモリアドレスを検索できます.
#include <stdio.h>
int main() {
    int *p; // 정수형 포인터 p 와 
    int a; // 정수형 a를 지정
    
    p = &a; // 포인터 p값을 a의 주소로 지정
    a = 2; 
    
    
    printf("%d \n", a); 
    printf("%d", *p); 	// *p를 이용하여 p에 저장된 주소의 데이터를 가져오는 역할 >>> 
    					//p = &a 를 통해 포인터p를 a 주소값으로 지정하였으므로 
                        // 주소 a의 데이터인 2를 가져옴
    
    return 0;
}
>>>2
>>>2
上記の*は、アドレス値に対応するデータを取得するために使用されます.
*pは、pに格納されたアドレス(変数aのアドレス)のデータ、すなわち変数aそのものを表す.
ソース:https://modoocode.com/23
#include <stdio.h>
int main() {
    int *p;
    int a;
    
    p = &a; // (1)포인터p를 a의 주솟값으로 지정
    *p = 3; // (2)*p를 통해 포인터 p의 주소의 데이터를 3으로 생각
    		// (3)*p는 p에 저장된 데이터 값을 가져오라는 의미
            // (4)p에 저장된 주소는 a
            // (5) => (2)에 의해 a의 값이 3이 됨
    
    printf("%d \n", a);
    printf("%d \n", *p);
    
    return 0;
}
>>>3
>>>3
aをインポートしたデータはなく、aをインポートしたデータの結果が出力される.
const int a =3; に示すように、データ型の前にconstを付けると、a値は絶対に変わりません.
強制的にa=5に設定すると、エラーメッセージが表示されます.
普段使っているarr[3]、*(arr+3)、3[arr]は同じ
ポインタとしてconstを使用する
https://starfish22.tistory.com/13
https://timing-bravery.tistory.com/49
https://ansan-survivor.tistory.com/1260
これが何を意味するか知っていますが、
const int* a1 = &aa // 주소변경만 가능
int const* a2 = &aa // 주소변경만 가능
int *const a3 = &aa // 정수변경만 가능
上の3つが混同された.
正確には1番目3番目は理解していますが、2番目を見るたびにどうすればいいか悩んでいますが、混同をスキップしてからもう一度見たほうがいいです
まず私は胃袋を3つ背負いました時間はかかりますが混同はしません.
**ppa = *(*ppa)
arr[][]、arr[0]、arr[0][0]のアドレスは互いに同じであるが、同じ値ではない
アドレス値(&)またはsizeofが使用されていない場合、arr[0]、arr[1]はarr[0][0]およびarr[1][0]を暗黙的に指すポインタに変換される.
int main() {
  int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
  printf("전체 크기 : %d \n", sizeof(arr));
  // 24
  
  printf("총 열의 개수 : %d \n", sizeof(arr[0]) / sizeof(arr[0][0]));
  //3 

  printf("%d \n", sizeof(arr[0]));
  //12
  //sizeof(arr[0]) = 0번째 행의 길이 = 열의 갯수
  //int 사이즈인 4를 곱해서 12가 나오는 것으로 추정
  
  printf("%d \n", sizeof(arr[0][0]));
  //4
  //sizeof(arr[0][0]) = int의 크기 4를 리턴
  //[0][0]으로 한 개의 값만을 가져오는데, 이 값의 크기는 4바이트
  
  printf("총 행의 개수 : %d \n", sizeof(arr) / sizeof(arr[0]));
  //2
  //전체 크기를 열의 크기로 나눈 값
  
}
ポインタを使用した2 D配列複写
(배열의 형) (*포인터 이름) [2차원 배열의 열 개수 = 2차원 배열의 행의 길이];
int (*parr)[3];  // 예시
parr[1] = *(parr +1)
parr[1][1]= *(*(parr +1) +1)
#include <stdio.h>
int main() {
  int *arr[3]; // 배열 arr을 포인터로 지정
  			   // arr[0] arr[1] arr[2]를 포인터로하여 주소지정이 가능해짐
  int a = 1, b = 2, c = 3;
  arr[0] = &a;
  arr[1] = &b;
  arr[2] = &c;

  printf("a : %d, *arr[0] : %d \n", a, *arr[0]);
  printf("b : %d, *arr[1] : %d \n", b, *arr[1]);
  printf("b : %d, *arr[2] : %d \n", c, *arr[2]);

  printf("&a : %p, arr[0] : %p \n", &a, arr[0]);
  return 0;
}
関数を呼び出すときは、&リットル値を使用し、関数を定義するときは*を使用して点を指定します.
예시
#include <stdio.h>
int change_val(int *i) { // 함수 정의 시 *를 이용한 포인터 사용
  i = 3;
  return 0;
}
int main() {
  int i = 0;

  printf("호출 이전 i 의 값 : %d \n", i);
  change_val(&i);   // 함수 호출시 &를 이용한 주솟값 사용
  printf("호출 이후 i 의 값 : %d \n", i);

  return 0;
}
関数を使用するときにmain()関数をアップロードする場合は、関数の定義を上に書く必要があります.
#include <stdio.h>
int swap(int *a, int *b); 			// 함수의 원형부분
int main() {
  int i, j;
  i = 3;
  j = 5;
  printf("SWAP 이전 : i : %d, j : %d \n", i, j);
  swap(&i, &j);
  printf("SWAP 이후 : i : %d, j : %d \n", i, j);

  return 0;
}
int swap(int *a, int*b) { 			// 함수의 정의부분
	int temp = *a;
    
    *a = *b;  // 외부인 main()에서 가져오기 때문에 *는 필수적으로 붙어야함
    *b = temp; // temp에 *을 붙이지 않은 이유는 함수 외부에서 가져오는 값이 없기때문
}