깊이 검토에서 C 언어 학습 : 배열과 포인터

C 어레이

어레이는 데 사용되는 동일한 유형의 연속 저장하는 컬렉션의 가변 순서. 모든 배열은 연속 된 메모리 위치로 구성된다.

배열을 선언

필수 요소는 요소의 유형 및 수를 지정

type arrayName [ arraySize ];

배열 초기화

//大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
//省略掉了数组的大小,数组的大小则为初始化时元素的个数。
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
//为数组中某个元素赋值
balance[4] = 50.0;

어레이 요소는 인덱스 어레이 이름을 통해 액세스 될 수있다.

다차원 배열

다음 다차원 배열 선언의 일반적인 형태는 다음과 같다 :

type name[size1][size2]...[sizeN];

이차원 배열은 본질적으로 1 차원 배열, 선언과 초기화의 목록이다 :

int a[3][4] = {  
 {0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */
 {4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */
 {8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
};
//内部嵌套的括号是可选的,下面的初始化与上面是等同的
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

함수에 배열 합격

함수의 매개 변수 함수의 매개 변수의 형태로 다음과 같은 세 가지 방법으로 선언해야 배열을 전달한다. 컴파일러에게 각 방법은 정수 포인터를받을 수 있기 때문에이 세 문장의 결과는, 같은 방법입니다.

1. 매개 변수의 형태로 포인터입니다 :

void myFunction(int *param) 
{ 
body of function
 }

2가 파라미터가 정의 된 배열 크기 :

void myFunction(int param[]) 
{ 
body of function
 }

3.가 파라미터가 정의되지 않은 배열 크기 :

void myFunction(int *param) 
{ 
body of function
 }

함수에서 배열을 반환

1 차원 배열에서 함수가 반환, 당신은 함수가 반환을 포인터를 선언해야합니다 :

int * myFunction()
{
 body of function
}

로컬 변수가 정의되지 않는 C는 함수의 리턴 어드레스 외부 로컬 변수를 지원하지 않는  정적  변수.

예 :

/*
从函数返回一个由10个随机数构成的数组
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
/* 要生成和返回随机数的函数 */
int * getRandom( )
{
  static int  r[10];
  int i;
 
  /* 设置种子 */
  srand( (unsigned)time( NULL ) );
  for ( i = 0; i < 10; ++i)
  {
     r[i] = rand();
     printf( "r[%d] = %d\n", i, r[i]);
 
  }
 
  return r;
}
 
/* 要调用上面定义函数的主函数 */
int main ()
{
   /* 一个指向整数的指针 */
   int *p;
   int i;
 
   p = getRandom();
   for ( i = 0; i < 10; i++ )
   {
       printf( "*(p + %d) : %d\n", i, *(p + i));
   }
 
   return 0;
}

배열 포인터

어레이 이름 어레이의 첫 번째 요소를 가리키는 포인터 상수이다.

double *p;
double balance[10];

p = balance;

밸런스는  포인트 및 균형 [0]에 대한 포인터, 즉 밸런스 어레이의 첫 번째 요소의 주소이다. P는  할당  밸런스  첫번째 요소의 어드레스. 상수 포인터 배열 이름으로 사용은 법적, 그리고 그 반대의 경우도 마찬가지입니다. 따라서 * (밸런스 + 4)는 평형 데이터 모드 [4] 합법적 접근이다.

참고 :

1 * P + (4)는 제 1 어드레스 (P)을 말한다는 (어드레스가 나타내는 페치) 상기 포인터의 균형 어레이 (잔량 [0])을 가리키고, P *이 첫번째 요소의 어드레스 값 (과제 우측이 *와 식 값 더하기 4 밸런스 [0] +4이다 표시량) 

2 * (p + 4) (어드레스가 나타내는 페치)는 점 (P)은 제 배열 균형 주소 (잔량 [0]) 포인터를 의미, p는 다시 어드레스 플러스 4 + 4, 4 + P * 값을 나타내는 따라서 * (p + 4)는 균형 [4] (5 개 요소의 값)을 나타낸다.

 

C 열거

열거는 C 언어의 기본 데이터 유형입니다. 열거 구문 정의 형식 :

enum enumName {enum1,enum2,……};

열거 타입 열거 소자를 형성 할 때 열거 소자 지정된 값, 1의 값을 더한 선행 요소없이 변경 될 수있다. 디폴트 값은 상기 제 정수 0 열거 부재, 전방 부재 (1)의 플러스 후속 열거 부재의 값이다.

열거의 정의

열거를 정의하는 세 가지 방법이 있습니다

1. 열거 유형을 정의하고 열거를 정의

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;

열거 타입을 정의 2. 또한 열거 정의

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;

3 열거 이름을 생략 열거 직접 정의한

enum
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

열거 타입 부호 INT의 지능이나 처리로 C 언어에서는, 그 C 언어 사양에 따라 상기 열거 타입을 이송하는 방법은 없다. 그러나 어떤 특별한 상황에서, 열거 형 연속 값이 때 연속 조건부 통과를 달성 할 수있다.

예 (이송 부재에 대해 열거 사용) :

#include<stdio.h>
 
enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
int main()
{
    // 遍历枚举元素
    for (day = MON; day <= SUN; day++) {
        printf("枚举元素:%d \n", day);
    }
}

열거 형 불연속이 열거 할 수 없습니다 트래버스 예 :

enum
{
    ENUM_0,
    ENUM_10 = 10,
    ENUM_11
};

 

C 포인터

알아 포인터 C 언어는 필요하다. 그것은 단지 작업을 간소화 할 수 없지만, 또한 동적 메모리 할당으로, 어떤 포인터가 집행되지 않습니다. 변수는 정의 된 메모리 위치 변수 하이픈 수있는 액세스 어드레스 연산자 (&)를 갖는다.

포인터는 무엇인가?

포인터 값이 직접 다른 변수의 어드레스, 즉, 메모리 위치를 해결하는 변수이다. 따라서, 포인터 변수의 값은 어드레스를 가리키는 것이다.

포인터 변수 선언의 일반적인 형태는 다음과 같다 :

type *var-name;

모든 포인터의 값의 유형이 대표의 16 진수 메모리 주소, 동일합니다. 다른 상수 또는 변수의 데이터 타입에 대한 포인터를 가리킨다.

어떻게 포인터를 사용 하는가?

포인터 변수를 정의 (1)

포인터 변수에 할당 2. 어드레스

액세스 포인터 변수에 사용 가능한 주소 3. 값.

이러한 단항 사용하여  * 피연산자 반환 변수의 값은 어드레스를 나타냈다. 다음 예는 다음과 같다 :

#include <stdio.h>
 
int main ()
{
   int  var = 20;   /* 实际变量的声明 */
   int  *ip;        /* 指针变量的声明 */
 
   ip = &var;  /* 在指针变量中存储 var 的地址 */

   /*取变量地址使用& */
   printf("Address of var variable: %p\n", &var  );
 
   /* 在指针变量中存储的地址 */
   printf("Address stored in ip variable: %p\n", ip );
 
   /* 使用指针访问值(*是取对应内存地址的值) */
   printf("Value of *ip variable: %d\n", *ip );
 
   return 0;
}

는 C에서 NULL 포인터

정확한 주소를 할당 할 수없는 경우, 포인터 변수를 선언 포인터 변수에 대한 NULL 값을 할당하는 것은 좋은 프로그래밍 방법입니다. 푸 NULL 포인터 값이라고 포인터, 널 포인터 0x0 주소.

널 포인터는 표준 라이브러리 제로 상수에 정의되어 있습니다. 메모리가 운영 체제에 예약되어 있기 때문에 대부분의 운영 체제에서, 프로그램은 메모리 주소 0에 대한 액세스를 허용하지 않습니다.

그러나, 메모리 주소 0은 포인터가 액세스 할 수있는 메모리 위치를 가리 키지 않음을 나타냅니다, 특별한 의미가 있습니다. 그러나, 관례, 포인터가 널 (null)이 (제로 값 (널)) 인 경우, 그것은 아무것도 가리 키지 않는 것으로 가정한다.

포인터 산술

C 수치로 표현되는 포인터의 주소이다. 따라서 포인터에서 산술 연산을 수행 할 수 있습니다. 그것은 네 산술 연산에 대한 포인터가 될 수 있습니다 : +, -, +, -.

ptr++

 가정하자  PTR는  어드레스 (1000)를 가리키는 포인터는 정수, 32 비트 정수, 각 추가 PTR, 만약 그 다음 정수 위치를 가리이다  PTR의  문자 주소 1000 점, 상기 동작은 포인터 발생할 위치 1001, 1001의 다음 문자 위치 때문이다.

증가 또는 포인터 변수를 감소

어레이의 각 요소를 입구 :

/*指针递增遍历*/
#include <stdio.h>
 
const int MAX = 3;
 
int main ()
{
   int  var[] = {10, 100, 200};
   int  i, *ptr;
 
   /* 指针中的数组地址 */
   ptr = var;
   for ( i = 0; i < MAX; i++)
   {
 
      printf("存储地址:var[%d] = %x\n", i, ptr );
      printf("存储值:var[%d] = %d\n", i, *ptr );
 
      /* 移动到下一个位置 */
      ptr++;
   }
   return 0;
}

/*指针递减遍历*/
#include <stdio.h>
 
const int MAX = 3;
 
int main ()
{
   int  var[] = {10, 100, 200};
   int  i, *ptr;
 
   /* 指针中最后一个元素的地址 */
   ptr = &var[MAX-1];
   for ( i = MAX; i > 0; i--)
   {
 
      printf("存储地址:var[%d] = %x\n", i-1, ptr );
      printf("存储值:var[%d] = %d\n", i-1, *ptr );
 
      /* 移动到下一个位置 */
      ptr--;
   }
   return 0;
}

비교 포인터

포인터는 이러한 == <및>과 같은 관계 연산자와 비교 될 수있다. 직접 비교 주소 포인터의 크기 비교. 이어서 사용 별표 될 수있는 변수 값 포인터 포인트를 비교 한 후, 원하는 값을 비교한다. 어레이 요소의 액세스 어드레스 수정 코드를 증가시키는 가변 어드레스 포인터 또는 어레이 VAR [MAX - 1]의 마지막 요소와 동일보다 작 그대로 다음, 증분 포인터 변수를 입력 :

#include <stdio.h>
 
const int MAX = 3;
 
int main ()
{
   int  var[] = {10, 100, 200};
   int  i, *ptr;
 
   /* 指针中第一个元素的地址 */
   ptr = var;
   i = 0;
   while ( ptr <= &var[MAX - 1] )
   {
 
      printf("Address of var[%d] = %x\n", i, ptr );
      printf("Value of var[%d] = %d\n", i, *ptr );
 
      /* 指向上一个位置 */
      ptr++;
      i++;
   }
   return 0;
}

포인터 배열

포인터 문의 배열 :

type *pointerArrayName[size];

//例如,声明一个由10个指向整数的指针构成的指针数组:
/*int *ptr[10];*/

다음 다음의 예는이 포인터 배열에 저장되어, 세 개의 정수를 사용

#include <stdio.h>
 
const int MAX = 3;
 
int main ()
{
   int  var[] = {10, 100, 200};
   int i, *ptr[MAX];
 
   for ( i = 0; i < MAX; i++)
   {
      ptr[i] = &var[i]; /* 赋值为整数的地址 */
   }
   for ( i = 0; i < MAX; i++)
   {
      //ptr[i]是指针数组中的指针,是整数的地址;*对指针指向整数的地址取出值
      printf("Value of var[%d] = %d\n", i, *ptr[i] );
   }
   return 0;
}

다음과 같이 :( 의심의 여지, 후속 연구) 포인터의 배열도 문자열 목록의 문자를 저장하는 데 사용 할 수있다

#include <stdio.h>
 
const int MAX = 4;
 
int main ()
{
   const char *names[] = {
                   "Zara Ali",
                   "Hina Ali",
                   "Nuha Ali",
                   "Sara Ali",
   };
   int i = 0;
 
   for ( i = 0; i < MAX; i++)
   {
      //names[i]是指针数值*names[]中的元素,是字符指针,names[i]所指向的变量的地址存放的值是字符串的首字母
      printf("Value of names[%d] = %s\n", i, names[i] );
   }
   return 0;
}

포인터에 대한 포인터

이 변수의 주소에 대한 포인터를 포함합니다. 우리는 포인터의 포인터를 정의하는 경우 첫 번째 포인터는 포인터의 주소, 실제 위치 값을 상기 제 포인터를 포함한다. 즉, 변수 이름 앞에 별표 두 개를 배치, 다음과 같이 포인터 변수에 대한 포인터를 선언해야합니다 :

type **pointerName;

목표 값 인 경우 포인터 값에 액세스하는 데 간접적으로 다른 포인터로 가리키는 두 개의 연산자 별표가 필요합니다 :

#include <stdio.h>
 
int main ()
{
   int  var,*ptr, **pptr;
   var = 3000;
   /* 获取 var 的地址 */
   ptr = &var;
   /* 使用运算符 & 获取 指向变量的指针ptr 的地址 */
   pptr = &ptr;
   printf("Value of var = %d\n", var );
   printf("Value available at *ptr = %d\n", *ptr );
   /* 使用 **pptr 获取值 */
   printf("Value available at **pptr = %d\n", **pptr);
   return 0;
}

함수에 대한 포인터를 전달

C 언어는 단순히 함수 매개 변수를 입력 할 수있는 포인터를 선언, 당신은 함수에 대한 포인터를 전달할 수 있습니다.

#include <stdio.h>
#include <time.h>
 
void getSeconds(unsigned long *par);

//也可以将数组名作为指针传递给函数,数组名就是数组的首地址。

int main ()
{
   unsigned long sec;
   getSeconds( &sec );//传递指针给函数,是传递的地址
   /* 输出实际值 */
   printf("Number of seconds: %ld\n", sec );
   return 0;
}
void getSeconds(unsigned long *par)
{
   /* 获取当前的秒数 */
   *par = time( NULL );//par指针指向的sec地址存储的值赋值为当前时间秒数
   return;
}

기능에서 포인터를 반환

C는 함수 포인터에서 반환 할 수 있습니다. 다음과 같이 따라서, 우리는 함수가 반환 포인터를 선언해야합니다 :

int * myFunction()
{
body of function
}

또한, C 언어는 지역 변수가 정적 변수로 정의하지 않는 한, 함수 주소를 호출 지역 변수의 반환을 지원하지 않습니다. :

로컬 변수의 함수가 종료 함수 호출의 끝은 로컬 변수는 공유 메모리 어드레스가 해제 될 메모리의 스택 영역에 저장되기 때문에,이 함수 내의 변수는 더 이상 해당 메모리 주소가 없다 따라서 포인터를 반환 할 수 없습니다.

이 변수 정적 변수로 정의되지 않는 한,하지 기능 실행 마지막으로, 상기 메모리 영역에 저장된 데이터의 고정 값을 클리어 정적 변수, 그것은 그 주소를 반환 할 수있다.

게시 된 161 개 원래 기사 · 원 찬양 90 ·은 50000 +를 볼

추천

출처blog.csdn.net/qq_42415326/article/details/104027363