포인터와 배열(4.29)

8539 단어 C 언어 기초
1 C 언어 1 레벨 포인터 변수와 1 차원 그룹
 
int data[5];
int *p;
 
p = data;
 
p[i] <=> data[i] <=> *(p + i)<=> *(data + i)
 
주의: 바늘 변수는 수조의 첫 번째 주소를 저장한 후 수조 이름으로 사용할 수 있으며, 다른 점은 바늘 변수가 하나의 변수라는 데 있다.
값을 바꿀 수 있지만, 그룹 이름은 주소 상수이기 때문에 값을 바꿀 수 없습니다.
 
 
더 깊은 이해:
데이터[i] 액세스 그룹의 i번째 구성원, 실제적으로'수 그룹의 첫 번째 주소 + 구성원 편이'를 통해 그룹의 구성원을 찾습니다
=>*(data + i);
 
data , &data[0],&data 
그들의 값은 같지만, 의미는 다르다
데이터는 그룹 이름입니다. 그룹의 첫 번째 주소만 표시합니다.
&data[0] 그룹 첫 번째 구성원의 주소를 표시합니다
&data는 전체 그룹의 주소를 가져옵니다. (그것을 구조 형식으로 처리합니다.)
 
연습:
int a[10] = {1,2,3,4,5,6,7,8,9,10};
이 그룹의 내용을 출력합니다. 4중 형식
 
#include 

int main()
{
    int i;
    int *p;
    int a[10] = {1,2,3,4,5,6,7,8,9,10};

    for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
    {
        printf("%d ",a[i]);
    }
    printf("
"); for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++) { printf("%d ",*(a + i)); } printf("
"); #if 0 for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++) { printf("%d ",*a ++);// ,a , , } printf("
"); #endif for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++) { printf("%d ",p[i]); } printf("
"); for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++) { printf("%d ",*p ++); } printf("
"); for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++) { printf("%d ",*(p + i)); } printf("
"); return 0; }

 
2 C 언어 1 레벨 포인터 변수와 문자열 상수
 
char *string = "hello word";
 
주의: "helloword"는 문자열 상수 구역에 저장되며, 바늘 변수string은 문자열의 첫 번째 주소를 저장합니다.
문자열 상수 영역의 내용은 수정할 수 없습니다.
 
연습:
char *string1 = "asdfgh";
char *string2 = "efghi";
char buf[1024];
 
string1과string2가 다른 문자를 찾아서 buf에 저장하고 마지막으로 buf의 내용을 출력합니다
 
for(q = string1;*q != '\0';q++)
{
 
       for(p= string2; *p != '\0';p++)
       {
              if(*p == *q)
                     break;
       }
 
       if(*p== '\0')
//분명히 'a'는string2에 없고 buf 그룹에 존재합니다
 
}
 
#include 

int main()
{
    char *p,*q;
    int count = 0;
    char buf[1024];
    char *string1 = "asdfgh";
    char *string2 = "efghi";

    printf("sizeof(string1) : %d
",sizeof(string1)); printf("sizeof(*string1) : %d
",sizeof(*string1)); for(p = string1; *p != '\0';p ++) { for(q = string2; *q != '\0';q ++) { if(*q == *p) break; } if(*q == '\0') { buf[count ++] = *p; } } for(p = string2; *p != '\0';p ++) { for(q = string1; *q != '\0';q ++) { if(*q == *p) break; } if(*q == '\0') { buf[count ++] = *p; } } buf[count] = '\0'; printf("buf : %s
",buf); return 0; }

3C 언어의 바늘 변수와 2차원 그룹
 
int a[3][2];
 
a[0][0]---a[0]: 0번째 줄의 첫 번째 주소 ----- a
a[0][1]
---------------------
a[1][0]---a[1]: 첫 번째 행의 첫 번째 주소 ------a+1
a[1][1]
---------------------
a[2][0]---a[2]: 두 번째 줄의 첫 번째 주소------a+2
a[2][1]
 
행 포인터(매번 + 1일 때 한 줄씩 움직이는 크기): a, a + 1, a + 2
열 지침(매번 + 1일 때 하나의 데이터 요소를 구성하는 크기): a[0], a[1], a[2]
 
행 포인터---(*) ---> 열 포인터
열 포인터---(더하기&)--->행 포인터
 
참고: 2D 배열에서만 포인터와 열 포인터를 구분합니다.
 
====================================================================================
연습: a[1][1] 구성원의 값을 얻으려면 어떤 문법이 있습니까?
 
a[1][1], *(&a[1][1]) , 
 
*(a[1]+1), *(a[0]+3)=>*(a[0]+1(간격의 행수)*2(행당 원소 개수)+1),
 
*(*(a + 1) + 1) ,  *(a[1] + 1)
=====================================================================================
 
#include 

int main()
{
    int i = 0;
    int j = 0;
    int a[3][3] = {1,2,3,4,5,6,7,8,9};

    for(i = 0;i < 3;i ++)
    {
        for(j = 0;j < 3;j ++)
        {
            printf("%d ",a[i][j]);
        }
        printf("
"); } printf("--------------------------
"); for(i = 0;i < 3;i ++) { for(j = 0;j < 3;j ++) { printf("%d ",*(a[i] + j)); } printf("
"); } printf("--------------------------
"); for(i = 0;i < 3;i ++) { for(j = 0;j < 3;j ++) { printf("%d ",*(*(a + i) + j));//a[i] <=> *(a + i) } printf("
"); } printf("--------------------------
"); for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++) { printf("%d ",*(*a + i)); } printf("
"); int *p; printf("--------------------------
"); for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++) { printf("%d ",*p ++);// *p , p = p + 1 } printf("
"); printf("--------------------------
"); for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++) { printf("%d ",p[i]);//*(p + i) } printf("
"); printf("--------------------------
"); for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++) { printf("%d ",*(p + i)); } printf("
"); return 0; }

//잘못된 이해
int **p;
p = a;//a는 1급 포인터 변수의 주소가 아닙니다. 이것은 그룹 이름입니다. 2차원 그룹에서 포인터 형식입니다.
 
연습:
int a[3][3] = {1,2,3,4,5,6,7,8,9};
2차원 그룹의 내용을 5중 형식으로 출력하다
 
=====================================================================================
생각: 어떻게 행 포인터 유형 변수를 정의합니까?
 
데이터 유형(*행 포인터 변수 이름) [행 요소의 개수];
 
int (*p)[3];//행 포인터 변수 p, 매번 +1, 매번 움직일 때마다 3개의 int형 데이터 크기
int *p[3];//포인터 배열
 
#include 

int main()
{
    int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    int (*p)[4];// 

    p = a;
    
    p ++;

    printf("%d
",**p);// p ,*p //* (*p) p = a; printf("%d
", *(p[2] + 1)); printf("%d
", *(*(p + 2) + 1)); return 0; }

연습: 포인터 변수 저장 그룹 inta[3][4]의 첫 번째 주소 a를 어떻게 정의합니까?
int (*p)[4];
 
p = a;
 
a[i][j] <=>p[i][j] <=> *(a[i] +j) <=> *(p[i] + j) <=> *(*(a + i) + j) <=> *(*(p+i) + j)
 
이때 p와 a의 차이는 p는 변수로 바꿀 수 있고 a는 주소 상수로 바꿀 수 없다.
 
p++;//16바이트, int 데이터 4개 이동
 
======================================================================================
연습: 3줄 4열의 2차원 그룹에 값을 입력한 다음, 하나의 줄 바늘 변수로 2차원 그룹의 내용을 출력한다.
(최소 5 중 출력 방법)
#include 

int main()
{
    int j;
    int i = 0;
    int a[3][4];
    int (*p)[4];

    printf("Input : ");

    for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)
    {
        scanf("%d",a[0] + i);
        //scanf("%d",*a + i);
    }
    
    p = a;

    for(i = 0;i < 3;i ++)
    {
        for(j = 0;j < 4;j ++)
        {
            printf("%d ",p[i][j]);
        }
        printf("
"); } for(i = 0;i < 3;i ++) { for(j = 0;j < 4;j ++) { printf("%d ",*(p[i] + j)); } printf("
"); } for(i = 0;i < 3;i ++) { for(j = 0;j < 4;j ++) { printf("%d ",*(*(p + i) + j)); } printf("
"); } for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++) { printf("%d ",*(a[0] + i)); } printf("
"); for(i = 0;i < 3;i ++) { for(j = 0;j < 4;j ++) { printf("%d ",*(*p + j)); } p ++; printf("
"); } for(i = 0,p = a;i < sizeof(a)/sizeof(a[0][0]);i ++) { printf("%d ",*((int *)p + i)); } return 0; }

좋은 웹페이지 즐겨찾기