C 지침 이 정확 하 다
복잡 한 유형 을 이해 하 는 것 은 매우 간단 하 다. 한 유형 에 많은 연산 자가 나타 날 것 이다. 그들 도 일반적인 표현 식 처럼 우선 순위 가 있 고 우선 순위 와 연산 우선 순위 가 있다. 원칙 을 기억 하 라. 변수 이름 부터 연산 자 우선 순위 에 따라 한 걸음 한 걸음 분석 하 라.
int p;
/* */
int *p;
/* P , * , P ,
int , int .
P
*/
int p[3];
/* P , [] , P ,
int , .
P
*/
int *p[3];
/* P , [] , * , P ,
* , ,
int ,
P
*/
int (*p)[3];
/* P , * , P
[] ,
int , .
P
*/
// int a[3] ,a
int **p;
/* P , * , P ,
* , ,
int , .
*/
int p(int);
/* P , () , P ,
() ,
int ,
*/
int (*p)(int);
/* P , , P ,
() , ,
() int , int ,
int , ,
P
*/
// !
int *(*p(int))[3];
/* P , () , P ,
() , int , ,
* , ,
, [] , ,
* , ,
int , .
P .
*/
int (*p[5])(int*);
/* p , [] , p ,
* , ,
() , ,
, int 。
p 。
*/
포인터 의 산술 연산
1. 지침 은 정 수 를 더 하거나 빼 도 된다.지침 의 이런 연산 은 단원 단위 이다.
char a[20]="You_are_a_girl";
int *ptr=(int *)a;
ptr+=5; 이 예 에서 ptr 는 5 를 더 했 습 니 다. 컴 파 일 러 는 이렇게 처 리 했 습 니 다. 포인터 ptr 의 값 에 5 곱 하기 sizeof (int) 를 더 하면 32 비트 프로그램 에 5 곱 하기 4 = 20 을 더 했 습 니 다.
2. 지침 과 지침 을 가감 한다. 두 지침 은 덧셈 연산 을 할 수 없다. 이것 은 불법 조작 이다. 덧셈 을 한 후에 얻 은 결 과 는 방향 을 모 르 는 곳 을 가리 키 고 의미 가 없 기 때문이다.두 지침 은 감법 작업 을 할 수 있 지만 유형 이 같 아야 하 며 일반적으로 배열 에 사용 된다.
3. 배열 의 첫 번 째 주소 a, & a, & a [0]
int a[10]
1. a 가 오른쪽 값 일 때 배열 의 첫 번 째 요 소 를 대표 하 는 첫 번 째 주 소 는 배열 의 첫 번 째 주소 가 아 닙 니 다.
바로 a [0] 의 주소 입 니 다.int i = * (a + 1), 여기 a 는 오른쪽 값 이 고 첫 번 째 요 소 를 대표 하 는 첫 번 째 주소 입 니 다. a + 1 은 다음 요소 의 첫 번 째 주 소 를 대표 합 니 다. 즉, & a [1] 입 니 다.
2. a 는 전체 배열 의 이름 이다.그래서 size of (a) 의 값 은 size (int) * 10 = 40 으로 전체 배열 의 크기 를 나타 낸다.3. & a 는 a 의 첫 번 째 주소, 즉 전체 배열 의 첫 번 째 주소 입 니 다.그래서 sizeof (& a) 의 값 은 4 입 니 다.
그러나 VC 6.0 에 40 이 라 고 표시 되 어 있 는 것 은 옳지 않다.code: block 에 4 가 표 시 됩 니 다.int * p = (int *) (& a + 1) 에서 & a + 1 은 다음 배열 의 첫 주 소 를 대표 하 는데 분명히 경 계 를 넘 었 다.
4. & a [0] 는 첫 번 째 요 소 를 대표 하 는 첫 번 째 주소 입 니 다.그래서 sizeof (& a [0]) 의 값 은 4 입 니 다.
5. & a [10] 분명히 배열 이 경 계 를 넘 었 지만 그의 size of 는 얼마 입 니까?또한 4. 키워드 sizeof 에서 값 을 구 하 는 것 은 컴 파일 할 때 a [10] 라 는 요소 가 존재 하지 않 지만 여 기 는 a [10] 를 진정 으로 방문 하지 않 고 뿌리 이기 때 문 입 니 다.
배열 요소 의 유형 에 따라 값 을 확인 합 니 다.그래서 sizeof (a [10]) 는 틀 리 지 않 습 니 다.
6. a [- 1] 는 무슨 뜻 입 니까?
먼저 아래 표 시 된 형식 이 컴 파일 러 에 의 해 포인터 로 해석 되 는 형식, 즉 a [1] 를 * (a + 1) 로 해석 하면 a [- 1] 는 * (a - 1) 로 해석 된다 는 것 을 알 아야 한다.
4. 포인터 배열 & 배열 포인터
포인터 배열: 우선 하나의 배열 입 니 다. 배열 의 요 소 는 모두 포인터 이 고 '포인터 저장 배열' 이 라 고도 부 릅 니 다.배열 포인터: 우선 포인터 입 니 다. 배열 을 가리 키 고 있 습 니 다.배열 의 지침 으로 도 이해 할 수 있다.
int * p1 [10] int (* p2) [10] 는 각각 무엇 을 대표 합 니까?이 문 제 를 분명히 하려 면 우선 [] 우선 순위 가 * 보다 높다 는 것 을 알 아야 한다.
p1 먼저 [] 와 결합 하여 하나의 배열 정 의 를 구성 합 니 다. 배열 의 이름 은 p1 이 고 int * 는 배열 의 내용, 즉 배열 의 모든 요 소 를 수식 합 니 다.
p2 중 () 의 우선 순위 가 [] 보다 높 기 때문에 * 번 호 는 P2 와 하나의 지침 의 정 의 를 구성 합 니 다. 지침 변 수 는 P2 이 고 int 는 배열 의 내용, 즉 배열 의 모든 요 소 를 수식 합 니 다.배열 은 여기 서 이름 이 없다.
5. 함수 포인터 & 포인터 함수
함수 포인터: 함 수 를 가리 키 는 포인터 변수 입 니 다.
포인터 함수: 포인터 가 있 는 함수, 즉 포인터 로 돌아 가 는 함수 입 니 다.
char * fun(char* a, char* b) //
{...... }
int main()
{
char* (*p)(char* p1, char* p2); //
p = &fun; //
//p = fun; //
(*p)("aa", "bb"); //
return 0;
} 포인터 인자:
int fun(char *s)
{
int num=0;
num+=*s;
s++;
return num;
}
int b;
char str[]="abcdefghijklmn";
b=fun(str); 함수 호출 에서 str 를 실제 인삼 으로 형 삼 s 에 전달 한 후에 실제 적 으로 str 의 값 을 s 에 전달 했다. s 가 가리 키 는 주 소 는 str 가 가리 키 는 주소 와 일치 하지만 str 와 s 는 각자 의 저장 공간 을 차지한다.함수 내 에서 s 에 대해 자체 1 연산 을 하 는 것 은 str 에 대해 동시에 자체 1 연산 을 하 는 것 을 의미 하지 않 는 다.
6. 포인터 상수 & 상수 포인터
const char* p1; // ,
char const* p2;
char* const p3; // , 어떻게 기억 합 니까?
a. 먼저 유형 명 을 제거 한 다음 에 const 가 누구 에 게 가 까 운 지 보고 누 구 를 수식 할 수 있 습 니 다.
b. const 가 * 왼쪽 에 있 는 것 은 상수 포인터 이 고 const 가 * 오른쪽 에 있 는 것 은 포인터 상수 입 니 다.
일곱
야생 지침 은 어떻게 생 긴 것 입 니까?
1. 포인터 변 수 는 초기 화 되 지 않 고 생 성 됩 니 다.
2. 포인터 p 가 free 또는 delete 된 후 NULL 로 설정 되 지 않 았 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.