c 언어 포인터 의 관련 개념

10456 단어 c포인터

1. 기초 개념
    c 언어 에서 기본 변 수 는 데 이 터 를 저장 하고 포인터 변 수 는 주 소 를 저장 하 는 변수 (다른 변수 액 주소) 입 니 다.c 언어 에서 포인터 도 주소 라 고 부 르 기 때문에 우 리 는 특정한 변수의 지침 을 자주 말 하 는데 특정한 변수의 메모리 에 있 는 주소 로 이해 할 수 있다.예 를 들 어 b 변수의 지침 은 1000 입 니 다.  b 메모리 에 있 는 주 소 는 1000 입 니 다. b 로 이해 할 수 없 는 포인터 변 수 는 4004 (잘못된 이해) 입 니 다.
2. 포인터 변수 정의
    c 언어 포인터 의 정의 형식 은 다음 과 같 습 니 다.
형식 설명자 * 포인터 변수 이름
    예:
int *p1,*p2;
 
//       
int* p1,p2;// p1 ×××  ,p2  ×××  

    c 에서 변수 앞 에 & 기 호 를 추가 하여 변수의 주 소 를 얻 을 수 있 습 니 다. 마찬가지 로 포인터 변수 앞 에 * 기 호 를 추가 하여 포인터 변수 가 가리 키 는 변수의 값 (이 메모리 주소 에 저 장 된 데이터) 을 얻 을 수 있 습 니 다. 예 를 들 어:
int a = 4;
int *p = &a;
printf("   p          %d \r
",*p);// , p , *p

3. 포인터 변 수 를 함수 매개 변수 로 한다.
//               
void fun(int *p1,int *p2)

//      :
int *ptr1 = &a1;
int  *ptr2 =  &a2;
fun(ptr1,ptr2)

    주: 호출 된 함수 에서 포인터 변수의 값 (즉 주소) 을 수정 하여 실제 인삼 을 바 꾸 려 는 목적 을 달성 하 는 것 은 잘못된 것 입 니 다.
    이 말 을 어떻게 이해 합 니까?여기 에는 비교적 헷 갈 리 기 쉬 운 문제 - 값 전달 과 인용 전달 의 차이 가 관련 되 어 있 습 니 다. 여기 서 이해 방식 을 제공 합 니 다. 다음 과 같 습 니 다. 실 삼 을 형 삼 에 게 전달 할 때 형 삼 은 모두 실 삼 의 내용 을 한 번 복사 하고 해당 하 는 함 수 를 호출 합 니 다.
void swap1(int num1,int num2){
	int temp = num1;
	num1 = num2;
	num2 = temp;
}
void swap2(int *num1,int *num2){
	//           (  )
	int *temp = num1;
	num1 = num2;
	num2 = temp;
}
void swap3(int *num1,int *num2){
	int temp = *num1;
	*num1 = *num2;
        *num2 = temp;
}

int main(){
	int a = 1,b = 2;
	int *ptr1 = &a,*ptr2 = &b;
	swap1(a,b);	//     :a = 1,b = 2

	swap2(ptr1,ptr2);	//     ,a = 1,b = 2

	swap3(ptr1,ptr2); // a = 2, b =1
}
4、      
             ,      (        
char *str1 = "tianya";
char str2[] = "tianya";

    
          : str1        ,str2      ,   str2      ++   ——    。           :
printf("str1     %s 
",str1); printf("str2 %s
",str2);

 
    그리고 우 리 는 다음 과 같은 몇 가지 정의 방식 이 다르다 는 것 을 이해 해 야 한다.
char *str = "tianya";
char str[] = "tianya";
char str[10] = "tianya";
char str[2] = "tianya";

5. 1 차원 배열 과 지침
    배열 과 지침 은 사람 을 현혹 시 키 기 쉬 운 곳 이다. 가장 중요 한 것 은 여러 가지 서로 다른 표현 방식 이 대표 하 는 서로 다른 의미 이다. 다음 에 우 리 는 한 걸음 한 걸음 다른 방식 을 이해 해 보 자.
   1) 정의 방식:
int a[5];    // a          ,           a[0]
int *p = a;    //    :int *p = &a[0];

    2) 포인터 로 배열 요 소 를 참조
int a[5] = {10,20,30,40,50};
int *p = a;    //   int *p = &a[0];
printf("the seconde elem is %d 
",a[1]);//20 printf("the seconde elem is %d
",*(a+1));//20 printf("the seconde elem is %d
",p[1]);//20 printf("the seconde elem is %d
",*(p+1));//20

    유사 하 게 추산 하면 우 리 는 a [i] 는 * (a + i) 와 같 고 그 중에서 a [0] 는 * a 또는 * (a + 0) 와 같다 는 것 을 알 수 있다.(p + i) 는 ptr [i] 와 같 습 니 다.일부 책 을 보면 이런 소개 * 와 [] 가 있 습 니 다. 앞의 예 와 결합 하여 우 리 는 다른 예 를 보 겠 습 니 다.
int a[5] = {10,20,30,40,50};
int *p = a;    //   int *p = &a[0];
printf("the seconde elem is %d 
",a[1]+1);//21 printf("the seconde elem is %d
",*a+1);//11, (*a)+1 *(a+0)+1 printf("the seconde elem is %d
",p[1]+1);//21 printf("the seconde elem is %d
",*p+1);//11, (*p)+1 *(p+0)+1

     우 리 는 이러한 사용 을 기본적으로 이해 할 수 있다 고 생각 하지 않 습 니까? 우 리 는 다시 깊이 공부 하 겠 습 니 다. * + 또는 - 만 났 을 때 어떤 상황 이 될 지:
//      
int a[5] = {10,20,30,40,50};
int *p = a;    //   int *p = &a[0];
printf("*p++ = %d 
",*p++); // 10, *(p++) // : int a[5] = {10,20,30,40,50}; int *p = a; // int *p = &a[0]; printf("*++p = %d
",*++p); //20, *(++p) // int a[5] = {10,20,30,40,50}; int *p = a; // int *p = &a[0]; printf("++*p = %d
",++*p); // 11, ++(*p)

    * + + 또는 -- 의 연산 자 우선 순위 와 같 고 결합 성 은 오른쪽 에서 왼쪽으로.기본적으로 다 안다 고 생각한다 면 다음 예 에서 무엇 을 출력 할 지 맞 춰 보 세 요.
int a[5] = {10,20,30,40,50};
int *p = a;    //   int *p = &a[0];
printf("*p++ = %d 
",*p++); printf("*++p = %d
",*++p); printf("++*p = %d
",++*p);

    현재 의 우 리 는 총 결 해 볼 수 있다.
p = & a [i] 가 있 을 때:
  • * p + + 는 a [i + +] 에 해당 합 니 다.
  • * + + p 는 a [+ i] 에 해당 합 니 다.
  • *p--   a [i --] 에 해당 합 니 다.
  • * - p 는 a [- i] 에 해당 합 니 다.

  • 6. 2 차원 배열 과 지침
        앞에서 우 리 는 이미 배 웠 습 니 다. 1 차원 배열 의 요소 값 은 [] 또는 * 로 얻 을 수 있 습 니 다.이와 유사 하 게 2 차원 배열 에서 우 리 는 * *, [] 또는 하나 * 와 하나 [] 를 사용 하여 얻 을 수 있 고 나머지 표현법 (즉 하나 * 또는 하나 []) 은 주소 만 얻 을 수 있다.소 개 는 다음 과 같다.
    //             
    int a[2][3] = {0,1,2,3,4,5};
    printf("address:%p, value:%d 
    ",&a[1][0],a[1][0]); printf("address:%p, value:%d
    ",a[1]+0,*(a[1]+0)); printf("address:%p, value:%d
    ",*(a+1)+1,*(*(a+1)+0));

        2 차원 배열 a 에서 이렇게 i 줄, j 열 주 소 를 얻 을 수 있 습 니 다.
    &a[i][j] , a[i]+j,*(a+i)+j
        대응 하 는 것 은 주소 앞 에 * 만 추가 하면 해당 하 는 값 을 얻 을 수 있 습 니 다.
    a[i][j],*(a[i]+j),*(*(a+i)+j)
        그럼 이제 어떤 지침 으로 2 차원 배열 을 가리 키 는 지 생각해 볼 까요?
       배열 을 가리 키 는 포인터 (* p) [] 가 2 차원 배열 을 가리 키 고 있 습 니 다.소 개 는 다음 과 같다.
    int a[2][3]={0,1,2,3,4,5};
    int (*p)[3] = a;
    	
    int i,j;
    for( i = 0; i < 2;i ++){
    	for(j = 0;j < 3;j++){
    		printf("a[%d][%d] = %d  ",i,j,*(*(p+i)+j));
    	}
    	printf("
    "); }

    좋은 웹페이지 즐겨찾기