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] 가 있 을 때:
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("
");
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.