programing

**는 C언어로 무엇을 합니까?

prostudy 2022. 5. 29. 09:20
반응형

**는 C언어로 무엇을 합니까?

저는 Java에 대한 좋은 배경을 가진 C는 처음이고 포인터와 배열을 이해하려고 노력 중입니다.

나는 그 첨자를 안다.operator[]는 어레이 정의의 일부입니다.따라서 다음과 같습니다.

int numbers[] = {1,3,4,5};

그러면 정수 배열이 생성됩니다.메모리는 16바이트, 4로트 4바이트로 표시됩니다.

numbers[0] = 1, address 0061FF1C
numbers[1] = 3, address 0061FF20
numbers[2] = 4, address 0061FF24
numbers[3] = 5, address 0061FF28

단, 포인터에 관한 지식이 무너지기 시작하고 어레이 번호에 대한 포인터를 작성하려면 다음 작업을 수행합니다.

int *pNumbers = &numbers[0];

이렇게 생겼을 겁니다.

숫자에 대한 포인터

사이즈는 4바이트가 될 것 같은데?

하지만, 그**저는 '포인터 투 포인터'라고 읽는데 의미가 없습니다.왜 포인터 투 포인터를 원하는 사람이 있을까요?a->b->c이면 충분하다면 a->c로 충분한가요?뭔가 부족한 것이 있다는 것을 알고 있습니다.또한 어레이와 관련이 있는 것이 틀림없습니다.argv종류일 수 있다char[ ]또는char **아래 그림과 같이:

int main(int argc, char **argv){}

그래서:

  • 이게 뭐죠?**)?
  • 그것은 무슨 소용이 있습니까?
  • 그것은 기억 속에서 어떻게 표현되는가?

C의 인수는 값에 의해 전달됩니다.예를 들어 main에 변수 가능한 정수가 있는 경우

int main( void )
{
    int x = 10;
    //...

및 다음 기능

void f( int x )
{
    x = 20;
    printf( "x = %d\n", x );
} 

이렇게 함수 전체를 호출하면

f( x );

그러면 매개 변수가 변수 값을 가져옵니다.x대강요.단, 파라미터 자체는 인수와 메모리 내에서 다른 범위를 차지합니다.따라서 함수 내의 파라미터 변경은 원래 변수에 영향을 주지 않습니다.이는 이러한 변경이 다른 메모리 범위에서 발생하기 때문입니다.

그렇다면 함수의 주요 변수를 변경하는 방법은 무엇일까요?

포인터를 사용하여 변수에 참조를 전달해야 합니다.

이 경우 함수 선언은 다음과 같이 표시됩니다.

void f( int *px );

함수의 정의는 다음과 같습니다.

void f( int *px )
{
    *px = 20;
    printf( "*px = %d\n", *px );
} 

이 경우 원래 변수가 사용하는 메모리 범위입니다.x함수 내에서 포인터를 사용하여 이 범위에 액세스할 수 있기 때문에 변경됩니다.

    *px = 20;

당연히 함수는 다음과 같이 주로 호출되어야 합니다.

f( &x );

포인터인 파라미터 자체를 고려합니다.px는 보통 함수의 로컬 변수입니다.즉, 함수는 이 변수를 생성하고 변수 주소로 초기화합니다.x.

예를 들어 다음과 같은 방법으로 포인터를 선언했다고 가정합니다.

int main( void )
{
   int *px = malloc( sizeof( int ) );
   //..

그리고 함수는 다음과 같이 정의됩니다.

void f( int *px )
{
    px = malloc( sizeof( int ) );

    printf( "px = %p\n", px );
}

As 파라미터px는 원래 포인터에 영향을 주지 않는 값을 할당하는 로컬 변수입니다.이 함수는 원래 포인터가 사용하는 메모리 범위와 다른 메모리 범위를 변경합니다.px대강요.

함수의 원래 포인터를 변경하는 방법참고만 하면 돼!

예를들면

f( &px );
//...

void f( int **px )
{
    *px = malloc( sizeof( int ) );

    printf( "*px = %p\n", *px );
}

이 경우 역참조를 사용하는 함수는 원래 포인터가 정의된 메모리 범위에 액세스하기 때문에 원래 포인터에 저장된 값이 함수 내에서 변경됩니다.

**in declaration은 포인터에 대한 포인터를 나타냅니다.포인터 자체는 데이터 유형이며 다른 데이터 유형과 마찬가지로 포인터를 가질 수 있습니다.

int i = 5, j = 6; k = 7;
int *ip1 = &i, *ip2 = &j; 
int **ipp = &ip1;  

여기에 이미지 설명 입력

포인터에 대한 포인터는 동적 2D 배열을 할당할 때 유용합니다.10x10 2D 어레이를 할당하려면(연속되지 않을 수 있음)

int **m = malloc(sizeof(int *)*10;  
for(int i = 0; i < 10; i++)
    m[i] = malloc(sizeof(int)*10  

함수를 통해 포인터의 값을 변경하려는 경우에도 사용됩니다.

void func (int **p, int n)  
{
    *p = malloc(sizeof(int)*n); // Allocate an array of 10 elements 
}

int main(void)
{
    int *ptr = NULL;
    int n = 10;
    func(&ptr, n);
    if(ptr)
    {
        for(int i = 0; i < n; i++)
        {  
             ptr[i] = ++i;
        }  
    }

    free(ptr);
}

추가 판독치: 포인터로의 포인터.

Q: 이게 뭐죠(**)?

네, 바로 그거에요.포인터에 대한 포인터.

Q: 무슨 소용이 있나요?

A: 여러 가지 용도가 있습니다.특히 2차원 데이터(이미지 등)의 표현에 있어서.이 예에서는char** argv배열로 생각할 수 있다chars. 이 경우 각각char*는 문자열의 선두를 가리킵니다.실제로 이 데이터를 직접 이렇게 명시적으로 선언할 수 있습니다.

char* myStrings[] = {
    "Hello",
    "World"
};

char** argv = myStrings;

// argv[0] -> "Hello"
// argv[1] -> "World"

배열과 같은 포인터에 액세스할 경우 해당 포인터를 인덱싱하는 숫자와 요소 자체의 크기가 배열에서 다음 요소의 주소로 오프셋되는 데 사용됩니다.이와 같이 모든 번호에 액세스할 수도 있습니다.실제로 이것이 C가 하고 있는 일입니다.컴파일러는 다음과 같은 유형의 바이트 수를 알고 있습니다.int는 컴파일 시에 사용합니다.따라서 각 단계가 다음 요소에 얼마나 커야 하는지 알 수 있습니다.

*(numbers + 0) = 1, address 0x0061FF1C
*(numbers + 1) = 3, address 0x0061FF20
*(numbers + 2) = 4, address 0x0061FF24
*(numbers + 3) = 5, address 0x0061FF28

*연산자를 참조 해제 연산자라고 합니다.포인터가 가리키는 메모리로부터 값을 취득하기 위해서 사용합니다. numbers는 말 그대로 배열의 첫 번째 요소에 대한 포인터일 뿐입니다.

에서는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★」myStrings포인터/주소가 4바이트라고 가정하면, 32비트 머신상에 있는 것을 의미합니다.

myStrings = 0x0061FF14

// these are just 4 byte addresses
(myStrings + 0) -> 0x0061FF14 // 0 bytes from beginning of myStrings
(myStrings + 1) -> 0x0061FF18 // 4 bytes from beginning of myStrings

myStrings[0] -> 0x0061FF1C // de-references myStrings @ 0 returning the address that points to the beginning of 'Hello'
myStrings[1] -> 0x0061FF21 // de-references myStrings @ 1 returning the address that points to the beginning of 'World'

// The address of each letter is 1 char, or 1 byte apart
myStrings[0] + 0 -> 0x0061FF1C  which means... *(myStrings[0] + 0) = 'H'
myStrings[0] + 1 -> 0x0061FF1D  which means... *(myStrings[0] + 1) = 'e'
myStrings[0] + 2 -> 0x0061FF1E  which means... *(myStrings[0] + 2) = 'l'
myStrings[0] + 3 -> 0x0061FF1F  which means... *(myStrings[0] + 3) = 'l'
myStrings[0] + 4 -> 0x0061FF20  which means... *(myStrings[0] + 4) = 'o'

여기에 저만의 답을 덧붙이려고 합니다.다들 훌륭하게 해 주셨지만 포인터의 포인터가 무엇인지에 대해서는 정말 혼란스러웠습니다.제가 이것을 생각해낸 이유는 포인터를 제외한 모든 값은 값으로 전달되고 포인터는 참조로 전달된다는 인상을 받았기 때문입니다.다음을 참조하십시오.

void f(int *x){
    printf("x: %d\n", *x);
    (*x)++;
}

void main(){
   int x = 5;
   int *px = &x;
   f(px);
   printf("x: %d",x);
}

다음과 같은 결과가 다음과 같습니다.

x: 5
x: 6

이 때문에 포인터는 포인터를 통과할 때 참조에 의해 전달되고 조작되어 새로운 값이 분할되어 인쇄된다고 생각했습니다.함수에서 포인터를 조작할 수 있다면...포인터를 조작하기 위해 포인터에 대한 포인터가 있는 이유는 무엇입니까?

제가 보기엔 잘못된 것 같았습니다. 왜냐하면 포인터를 조작할 수 있는 기능이 있는데 포인터를 조작하는 것은 어리석은 일이기 때문입니다.하지만 C는 모든 것이 가치로, 심지어 포인터로 전달된다는 것입니다.주소 대신 몇 가지 의사 값을 사용하여 자세히 설명하겠습니다.

//this generates a new pointer to point to the address so lets give the
//new pointer the address 0061FF28, which has the value 0061FF1C.
void f(int 0061FF1C){
    // this prints out the value stored at 0061FF1C which is 5
    printf("x: %d\n", 5);
    // this FIRST gets the value stored at 0061FF1C which is 5
    // then increments it so thus 6 is now stored at 0061FF1C
    (5)++;
}

void main(){
   int x = 5;

   // this is an assumed address for x
   int *px = 0061FF1C;

   /*so far px is a pointer with the address lets say 0061FF24 which holds
    *the value 0061FF1C, when passing px to f we are passing by value...
    *thus 0061FF1C is passed in (NOT THE POINTER BUT THE VALUE IT HOLDS!)
    */

   f(px);

   /*this prints out the value stored at the address of x (0061FF1C) 
    *which is now 6
    */
   printf("x: %d",6);
}

포인터에 대한 포인터의 주된 오해는 pass by value vs pass by reference입니다.원래 포인터는 함수에 전혀 전달되지 않았기 때문에 가리키는 주소는 변경할 수 없습니다.새로운 포인터의 주소만 변경할 수 있습니다(오래된 포인터가 가리키는 주소를 가리키는 것처럼 오래된 포인터인 것처럼 착각합니다!).

argv는 " " 입니다.char *argv[]문자(즉 문자열 배열)에 대한 포인터 배열에 대한 자세한 정보를 제공합니다.

는 「 」, 「 」, 「 」, 「 」, 「 」, 「 」의로 남습니다.char , 「」char **.


포인터에 할 때도 할 수 경우 '두이 있습니다. 따라서 질문 끝에 추가된 컨텍스트가 없으면 다음 질문에 대한 두 가지 답이 있습니다.**C로 하다

argv를 들어, 첫 첫 문자를 수 중 하나입니다.argv 것이 될 것이다argv[0][0]또는 참조 해제 연산자를 두 번 사용할 수 있습니다( 참조 해제 연산자는 다음과 같습니다.**argv.

대부분의 경우 포인터 또는 어레이에 대해 어레이 인덱싱과 비참조 기능을 상호 사용할 수 있습니다.p 인덱스 " " "i그 the p[i] *(p + i) 만약 ★★★★★★★★★★★★★★★★★★★★★.i0 '우리'가 있어요.*(p + 0) '''로 할 수 있습니다.*(p) 인 것 같습니다.*p.

궁금해서 그러는데p[i] *(p + i)덧셈의 교환적 특성, 표현은*(p + i) *(i + p) 그 which 로 이어집니다.p[i]i[p].


마지막으로 포인터의 과도한 사용에 대한 경고로, 당신은 가끔 3성 프로그래머라는 문구를 들을 수 있습니다. 이것은 다음과 같은 별표를 3개 사용하는 경우입니다.***( ( ( ( ( ( ( ( ( ( ) 。

확실히 하자면:ThreeStar Programmer라고 불리는 것은 보통 칭찬이 아닙니다.

그리고 또 다른 경고:배열은 포인터에 대한 포인터와 동일하지 않습니다(내 오래된 답변에 대한 링크. 또한 배열의 대체로서 포인터에 대한 포인터의 메모리 레이아웃을 보여줍니다).

**는 이름을 알고 있는 포인터에 대한 포인터를 나타냅니다..

이게 뭐야(**)?

포인터에 대한 포인터.때때로 사람들은 더블 포인터라고 부른다.예를 들어 다음과 같습니다.

int a = 3;
int* b = &a; // b is pointer. stored address of a
int**b = &b;  // c is pointer to pointer. stored address of b
int***d = &c; // d is pointer to pointer to pointer. stored address of d. You get it. 

그것은 기억 속에서 어떻게 표현되는가?

c위의 예에서는 정규 변수일 뿐이며 다른 변수(예: int ...)와 동일한 표현을 사용합니다.는, 「C」와 .b플랫폼에 따라 다릅니다.예를 들어, 32비트 컴퓨터의 경우 각 변수 주소에는 32비트가 포함되므로 크기가 4바이트(8x4=32비트) 64비트 컴퓨터에서 각 변수 주소는 64비트이므로 크기가 8바이트(8x8=64비트)가 됩니다.

그것은 무슨 소용이 있습니까?

상황에 따라 포인터 투 포인터의 용도는 다양합니다.예를 들어 알고리즘 수업에서 배운 예를 하나 들어보겠습니다.연결된 목록이 있습니다.다음으로 링크 리스트를 변경하는 메서드를 작성하면 링크 리스트의 헤드가 변경될 수 있습니다(예: 값이 5인 요소 1개 삭제, 헤드 요소 삭제, 스왑 등).두 가지 경우가 있습니다.

1. 헤드 요소의 포인터를 건네주면 됩니다.해당 헤드 요소가 제거되고 이 포인터는 더 이상 유효하지 않습니다.

2. 헤드 요소의 포인터 포인터를 넘긴 경우.헤드 요소가 제거되어도 포인터의 포인터가 그대로 있기 때문에 문제가 발생하지 않습니다.다른 헤드 노드의 값을 변경할 뿐입니다.

위의 예에서는 여기를 참조할 수 있습니다.링크 리스트의 포인터

또 다른 용도는 2차원 배열에서 사용하는 것입니다.C는 Java와 다릅니다.C의 2차원 배열, 사실은 그냥 연속 메모리 블록입니다.Java의 2차원 어레이는 멀티 메모리 블록(행렬에 따라 다름)

이것이 도움이 되기를 바랍니다:)

**포인터에 대한 포인터를 나타냅니다.포인터에대한 포인터를 나타냅니다.만약 당신의 참고에 의해 매개 변수에 합격하고 싶매개 변수를 전달하려면 다음과 같이 하십시오 참조로를 사용할 것입니다.*단, 포인터 자체를 참조로 전달하려면 포인터에 대한 포인터가 필요합니다.**.

문자열 테이블과 같은 포인터 테이블이 있다고 가정합니다('C'의 문자열은 문자열의 첫 번째 문자에 대한 포인터로 간단히 처리되기 때문입니다).

그런 다음 테이블의 첫 번째 포인터에 대한 포인터가 필요합니다.따라서 "char **"가 됩니다.

2차원 정수 테이블과 같이 모든 값이 포함된 인라인 테이블이 있는 경우, 한 수준의 간접(즉, "int *"와 같은 단순한 포인터)만으로 완전히 벗어날 수 있습니다.그러나 최종 결과에 도달하기 위해 참조를 해제해야 하는 포인터가 중간에 있는 경우 두 번째 수준의 간접이 생성되고 포인터에 대한 포인터가 필수적입니다.

또 다른 설명이 있습니다."C"에서 포인터 표기법(예: "*ptr")과 배열 색인 표기법(예: ptr[0])을 통한 참조는 배열 표기법에서 명백한 색인 값 외에는 거의 차이가 없습니다.아스타리스크 대 대 괄호가 실제로 중요한 유일한 시간은 변수를 할당하는 경우입니다(예: int *x;는 int x[1]와 매우 다릅니다).

예를 들어의 포인터로,**는 포인터입니다.예를 들어 **는 포인터에 대한 포인터입니다. char **argv는 A로 같다 같다char *argv[]그리고 이것은 그리고 이것은같은 것이다와 같다.char argv[][]. 그것은 행렬.매트릭스에요

예를 들어, 4개의 행이 있는 행렬을 선언할 수 있지만 JaggedArray와 같이 열의 수는 다릅니다.

그것은 매트릭스로 표현된다.

여기 기억의 표현이 있습니다.

나는 나는이해할 것이다 이해할 것이다.char **argv~하듯이로char** argv. 이제, .지금이다,char*기본적으로는 의 배열입니다의 기본적으로 배열입니다.char, 그렇게 ,그렇게(char*)*의 배열입니다의 배열의 배열입니다.char.

다른( 느슨한)말로, 바꿔 말하면,argv문자열의 배열입니다.A문자열 배열입니다.이 특별한 예에서:호출 이예에서는 콜이.

myExe dummyArg1 dummyArg2

콘솔에 콘솔에서는을 만들 것argvas~하듯이

argv[0] = "myExe"
argv[1] = "dummyArg1"
argv[2] = "dummyArg2"

실제로 C 어레이에는 다음과 같은 포인터가 있습니다.

char* string = "HelloWorld!";

이:다음과 같습니다 는과 마찬가지입니다.char string[] = "HelloWorld";그리고 이:그리고 이것은:char** argv면서 당신은"의 포인터로 포인터".' 말했다.지시 포인터'라고 하셨잖아요

여러 문자열의 배열로 볼 수 있습니다.하지만 끈은 문자 포인터라는 것을 기억하세요!

참조: Java의 메인 메서드는 C 메인 함수와 유사합니다.이런 느낌이에요.

public static void main(String[] args){}

I.e 문자열의 배열입니다.즉,문자열 배열입니다.그것은 C, C에서도 동일하게 동작합니다에서 같은 방식으로 작동합니다.String[] args된다가 되char** args또는 또는char* args[].

한마디로 요약하면 정리하면:type* name = blablabla;"형식"의 잠재적으로 배열입니다.'형'을 수 있습니다. ★★★★★★★★★★★★★★★★★.type** name = blabla;는 어레이 어레이일 가능성이 있습니다.

★★★★★★의int *: 「」라고 하는 것

사이즈는 4바이트가 될 것 같은데?

Java와 달리 C는 데이터 유형의 정확한 크기를 지정하지 않습니다.구현마다 크기가 다를 수 있으며 사용할 수도 있습니다(단, 구현마다 일관성이 있어야 합니다). 바이트 4 인치int현재 으로 사용되고 있습니다만, 「 」는 「 」입니다.ints는 2바이트만큼 작을 수 있으며 본질적으로 4바이트로 제한되는 것은 없습니다.포인터의 크기는 훨씬 더 적게 지정되지만, 일반적으로 C 구현의 대상이 되는 하드웨어 아키텍처에 따라 달라집니다.가장 일반적인 포인터 크기는 4바이트(32비트 아키텍처의 경우 표준)와 8바이트(64비트 아키텍처의 경우 공통)입니다.

이게 뭐야(**)?

입니다.char **char당신이 생각한 대로.

그것은 무슨 소용이 있습니까?

가 다른 데이터 유형에 대한 포인터로서 거의 동일하게 사용됩니다.다른 유형의 값에 간접적으로 액세스하거나 액세스해야 하는 경우와 마찬가지로 포인터 값에 간접적으로 액세스해야 하는 경우가 있습니다.또한 포인터의 배열(첫 번째 요소)을 가리킬 때 유용합니다.이것은 C에 대한 두 번째 파라미터에서 사용되는 방법입니다.main()★★★★★★ 。

각 「」는,char *포인트 투 어레이 자체에서 프로그램의 명령줄 인수 중 하나를 가리킵니다.

그것은 기억 속에서 어떻게 표현되는가?

C는 지정하지 않지만 일반적으로 포인터에 대한 포인터는 다른 유형의 값에 대한 포인터와 동일한 표현을 가집니다.이 값이 가리키는 값은 단순히 포인터 값입니다.

우선 C는 Java와 매우 다르게 어레이를 취급한다는 점에 유의하십시오.같은 선언.

char foo[10];

는 10개의 10개의 10개의 할 수 있습니다.char(어라인먼트 요건을 충족하기 위해 추가 공간을 모듈화함), 첫 번째 요소 또는 어레이 크기나 요소 클래스 유형 등의 메타데이터에 대한 포인터를 위해 추가 스토리지가 확보되지 않습니다.오브젝트는 없습니다.foo어레이 요소 자체를1 제외하고요.대신, 언어에는 컴파일러가 명령어가 아닌 배열 식을 볼 때마다 규칙이 있습니다.sizeof 단항식&연산자(또는 선언에서 다른 배열을 초기화하기 위해 사용되는 문자열 리터럴)는 N-element 배열 유형에서 해당 식을 암묵적으로 변환합니다.T "to "to "to "to "to "T의 첫

여기에는 몇 가지 의미가 있습니다.첫 번째는 어레이 식을 인수로 함수에 전달하면 함수가 실제로 받는 것은 포인터 값입니다.

char foo[10];
do_something_with( foo );
...
void do_something_with( char *p )
{
  ...
}

파라미터 " " " "p 파라미터에 foo는 포인터입니다.char 의 .char는 C를 허용한다do_something_with

void do_something_with( char p[] )

또는 심지어

void do_something_with( char p[10] )

, 함수 선언의 , '기능 파라미터 선언'의 경우,T p[] ★★★★★★★★★★★★★★★★★」T p[N]T *p 세 모두 선언을 합니다.p배열이2 아닌 포인터로 사용할 수 있습니다.이는 함수 파라미터 선언에만 해당됩니다.

번째 연산자 " " " 입니다.[]는 포인터 및 할 수 를 들어, 포인터 오퍼랜드에서는 할 수 있습니다.

char foo[10];
char *p = foo;
...
p[i] = 'A'; // equivalent to foo[i] = 'A';

마지막 의미는 포인터에 대한 포인터를 다루는 하나의 사례로 이어집니다 - 당신이 다음과 같은 포인터의 배열을 가지고 있다고 가정합니다.

const char *strs[] = { "foo", "bar", "bletch", "blurga", NULL };

strs는 5개의 로 구성되어 있습니다.const char *3; 단, 다음과 같은 함수에 전달하면

do_something_with( strs );

그러면 함수가 수신하는 것은 포인터 배열이 아니라 포인터에 대한 포인터입니다.

void do_something_with( const char **strs ) { ... }

포인터(및 보다 높은 수준의 간접)에 대한 포인터도 다음과 같은 상황에서 표시됩니다.

  • 포인터 유형의 매개 변수에 쓰기:C는 모든 파라미터를 값으로 전달합니다.함수 정의의 형식 파라미터는 함수 호출의 실제 파라미터와 메모리 내의 다른 오브젝트이기 때문에 함수가 실제 파라미터 값을 갱신하도록 하려면 해당 파라미터에 포인터를 전달해야 합니다.

    void foo( T *param ) // for any type T
    {
      *param = new_value(); // update the object param *points to*
    }
    
    void bar( void )
    {
      T x;
      foo( &x );   // update the value in x
    }
    
    으로 타입을 .T 타입의 「」를 .R *코드 스니펫은 다음과 같습니다.

    void foo( R **param ) // for any type R *
    {
      ...
      *param = new_value(); // update the object param *points to*
      ...
    } 
    
    void bar( void )
    {
      R *x;
      foo( &x );   // update the value in x
    }
    
    의미입니다. x엔 그냥냥 . . . . . . . . . .x에는 이미 포인터 유형이 있으므로 포인터에 포인터를 전달해야 합니다.이것은, 보다 높은 레벨의 방향으로 확장할 수 있습니다.

    void foo( Q ****param ) // for any type Q ***
    {
      ...
      *param = new_value(); // update the object param *points to*
      ...
    } 
    
    void bar( void )
    {
      Q ***x;
      foo( &x );   // update the value in x
    }
    
  • 동적으로 할당된 다차원 어레이:C에서 다차원 배열을 할당하는 일반적인 기술 중 하나는 포인터의 배열을 할당하고 해당 배열의 각 요소에 포인터가 가리키는 버퍼를 할당하는 것입니다.

    T **arr;
    arr = malloc( rows * sizeof *arr );  // arr has type T **, *arr has type T *
    if ( arr )
    {
      for ( size_t i = 0; i < rows; i++ )
      {
        arr[i] = malloc( cols * sizeof *arr[i] ); // arr[i] has type T *
        if ( arr[i] )
        {
          for ( size_t j = 0; j < cols; j++ )
          {
            arr[i][j] = some_initial_value();
          }
        }
      }
    }
    
    은 더 수준의 될 수 에, '어느 정도 '어느 정도', '어느 정도', '어느 정도', '어느 정도' 등의 유형이 .T *** ★★★★★★★★★★★★★★★★★」T ****등 , , 등.


1. 이것이 어레이 식이 할당의 대상이 되지 않는 이유 중 하나입니다.할당 대상이 되는 것은 아무것도 없습니다.

  1. 가 "C"로 됩니다.BEELLYORKEXXXXX자형이다.auto p[]

  2. 각 문자열 리터럴은 다음과 같은 배열입니다.char, 「 」의 개별 하지 않기 때문에, 「 」는 「 」의 각 어레이를 초기화하고 있지 않습니다.char이치노

포인터에 대한 포인터입니다.포인터에 대한 포인터를 사용하는 이유를 묻는 경우, 여기에 다양한 방법으로 응답하는 유사한 스레드가 있습니다.

왜 더블 포인터를 사용하는가?아니면 왜 포인터에 포인터를 사용하는가?

언급URL : https://stackoverflow.com/questions/35021521/what-does-do-in-c-language

반응형