>백엔드 개발 >C#.Net 튜토리얼 >C 언어에서 포인터의 용도는 무엇입니까?

C 언어에서 포인터의 용도는 무엇입니까?

coldplay.xixi
coldplay.xixi원래의
2020-11-02 09:12:5518061검색

C 언어 포인터 사용법: 1. 포인터 변수의 기본값은 일반 변수처럼 불확실하며 일반적으로 NULL로 초기화됩니다. 2. 포인터 변수의 사용법은 일반 변수와 다르며 일반적으로 p로 끝나는 것으로 구별됩니다. 3. 포인터 변수의 종류가 결정됩니다. 포인터 변수를 통해 메모리에 접근할 때 몇 바이트에 접근하는지를 결정합니다.

C 언어에서 포인터의 용도는 무엇입니까?

C 언어 포인터 사용법:

1. 포인터 정의:

포인터 변수의 값 범위는 0~4G이며, 이는 데이터 유형(부호 없는 정수, 메모리 번호를 나타냄)입니다. 변수를 정의하는 데 사용할 수 있습니다(int 및 long과 동일). int 및 long과 달리, 메모리 번호를 나타내는 정수를 저장합니다. 이 변수를 통해 해당 번호의 메모리에 접근할 수 있습니다.

둘째, 포인터의 역할

1. 힙 메모리에는 이름을 지정할 수 없으며(식별자는 힙 메모리와의 연결을 설정하는 데 사용할 수 없음) 포인터를 사용해야 합니다.

2. 함수 간 매개변수는 값(메모리 복사)으로 전송됩니다. 포인터를 사용하면 매개변수 전송 효율성을 최적화할 수 있습니다(변수는 보호되어야 함). C 언어는 값 전송(메모리 복사)을 사용하기 때문에 변수 바이트 수가 늘어날수록 연산 효율이 떨어지며, 전송된 변수의 주소는 항상 4~8바이트만 복사하게 됩니다.

void func(const int* p);하지만 포인터 변수의 값은 수정될 수 있으므로 const와 함께 사용할 수 있습니다. void func(const int* p);但使用指针变量的值可能会被修改,可以配合const。  

3、函数之间是相互独立的,有时协同配合需要共享变量(全局变量过多会造成命名冲突,不会被释放浪费内存),函数之间传递变量的地址可以达到共享变量的效果。

三,指针的用法:

定义:类型* 变量名_p;  

 1、指针变量与普通变量一样默认值不确定,一般初始化为NULL。

 2、指针变量的用法与普通变量不同,一般以p结尾加以区分。

 3、指针变量的类型决定了通过指针变量访问内存时访问几个字节。

 4、指针变量不能连续定义(一个*只能定义出一个指针变量):

  int* p1,p2; // p是指针,p2是int类型变量

  int *p1,*p2; // p1和p2都是指针变量

赋值:指针变量 = 内存编号。   变量名_p = 地址;

    内存编号要能够访问,如果编号错误可能会造成段错误。void*可以与任意类型指针进行自动转换(C++中不行)。要保障地址与物理内存有对应关系(映射过),否则有段错误。

 int* p = malloc(4);
 int* p = # // 引用内存

访问:*指针变量 //解引用----访问指针变量

 根据指针变量中存储的内存编号去访问对应的内存。如果之前赋值的内存编号有误,这个步骤会出现段错误。访问的字节由指针类型决定。     int* p = #                   *p 96b4fef55684b9312718d5de63fb7121 num;

5,指针运算

指针变量中存储的就是整数,因此为整型数据能使用的运算符指针变量基本都能使用

,但不是所有运算都有意义。

指针+整数 = 指针+宽度*整数

指针-整数 = 指针-宽度*整数 // 指针进行前后移动

指针-指针 = (指针-指针)/宽度 // 两个指针之间相隔多少个元素

指针 >、d2714fbb0e49a95306c2048bc19e4f2b= 指针 可以判断两个谁在前谁在后。

6,数组与指针

 .数组名就是个特殊的地址,也能当指针使用,数组名是个常量(数组名与数组第一个元素的首地址是对应关系,普通指针是指向关系)。数组名可以使用指针的解引用,而指针变量也可以使用数组的[];arr[i] 96b4fef55684b9312718d5de63fb7121 *(arr+i)。数组当函数的参数就脱变成了指针变量,长度丢失,安全性也变小void func(int * const arr,size_t len);

7,指针的高级使用

数组指针与指针数组:

(1).数组指针(指针):专门用来指向数组的指针。

int arr[10];
int (*p)[10] = arr;
int* p = #

void func(int I,int J,int(*arr)[J])  //二维数组 函数传参使用数组指针

(2).指针数组(数组):一个数组里存储的数据类型是指针。

                把无序的离散数据,归纳到一起。

int* arr[3]; 96b4fef55684b9312718d5de63fb7121 int *p1,*p2,*p3;

(3).二级值针: 指向指针的指针

4.函数指针: 指向函数的指针(不能解引用)

9,const 指针

 const int * p; // 不能通过解引用去修改指针所指向的内存的数据

 (1)保护函数的参数

 (2)当指针指向的是只读数据,也应该加上const防止出现段错误。

   int const * p; // 同上

   int* const p;

3. 함수는 서로 독립적입니다. 때로는 조정에 공유 변수가 필요합니다(전역 변수가 너무 많으면 이름 지정 충돌이 발생하고 함수 간에 변수 주소를 전달하면 공유 변수의 효과를 얻을 수 있습니다). 🎜🎜🎜3. 포인터 사용법: 🎜🎜🎜정의: Type* 변수 이름_p; 🎜🎜 1. 포인터 변수는 일반 변수와 동일한 기본값을 가지며 일반적으로 NULL로 초기화됩니다. 🎜🎜 2. 포인터 변수의 사용법은 일반 변수와 다르며, 대개 p로 끝나는 것으로 구별됩니다. 🎜🎜 3. 포인터 변수의 유형에 따라 포인터 변수를 통해 메모리에 접근할 때 몇 바이트에 접근하는지가 결정됩니다. 🎜🎜 4. 포인터 변수는 연속적으로 정의할 수 없습니다(하나의 *는 하나의 포인터 변수만 정의할 수 있음): 🎜🎜 int* p1,p2; // p는 포인터, p2는 int 유형 변수🎜 🎜 int *p1,*p2; // p1과 p2는 모두 포인터 변수입니다🎜🎜할당: 포인터 변수 = 메모리 번호. 변수 name_p = 주소 🎜🎜 메모리 번호에 접근할 수 있어야 합니다. 번호가 틀리면 세그폴트가 발생할 수 있습니다. void*는 자동으로 모든 유형의 포인터로 변환될 수 있습니다(C++에서는 제외). 주소가 실제 메모리(매핑)와 일치하는지 확인하세요. 그렇지 않으면 세그폴트가 발생합니다. 🎜
*p_num=10
请输入一个数字:1
*p_num是1
*ptr=10
🎜액세스: *포인터 변수 //역참조----포인터 변수에 액세스🎜🎜포인터 변수에 저장된 메모리 번호에 따라 해당 메모리에 액세스합니다. 이전에 할당된 메모리 번호가 올바르지 않으면 이 단계에서 분할 오류가 발생합니다. 액세스되는 바이트는 포인터 유형에 따라 결정됩니다. int* p = #                                            모든 작업이 의미 있는 것은 아닙니다. 🎜🎜Pointer + Integer = 포인터 + 너비 * 정수 🎜🎜 포인터 - 정수 = 포인터 - 너비 * 정수 // 포인터가 앞뒤로 이동합니다 🎜🎜 포인터 - 포인터 = (포인터 - 포인터)/너비 // 거리가 얼마나 됩니까? 두 포인터 사이 요소 🎜🎜 포인터>, 91eef5681cad6f0cc96f9adeb2931b45= 포인터는 둘 중 어느 것이 앞에 있고 누가 뒤에 있는지를 결정할 수 있습니다. 🎜🎜6. 배열 및 포인터🎜🎜. 배열 이름은 특수 주소이며 포인터로도 사용할 수 있습니다. 배열 이름은 배열의 첫 번째 요소의 첫 번째 주소에 해당합니다. 일반 포인터는)를 가리킵니다. 배열 이름은 포인터 역참조를 사용할 수 있으며 포인터 변수는 배열의 [];arr[i] 96b4fef55684b9312718d5de63fb7121 배열을 함수 매개변수로 사용하면 길이가 손실되고 보안이 작아집니다. void func(int * const arr, size_t len);🎜🎜7, 포인터의 고급 사용🎜🎜배열 포인터 및 포인터 배열:🎜 🎜(1).배열 포인터(포인터): 배열을 가리키는 데 특별히 사용되는 포인터입니다. 🎜rrreee🎜void func(int I,int J,int(*arr)[J]) //2차원 배열 함수는 배열 포인터를 사용하여 매개변수를 전달합니다🎜🎜(2).포인터 배열( array) : 배열에 저장된 데이터 유형은 포인터입니다.数据 무질서하게 분리된 데이터를 하나로 요약합니다. 🎜🎜int* arr[3]; 96b4fef55684b9312718d5de63fb7121 int *p1,*p2,*p3;🎜🎜(3) 보조 값 바늘: 포인터에 대한 포인터🎜🎜4. : 함수에 대한 포인터(역참조할 수 없음) 🎜🎜9, const 포인터 🎜🎜 const int * p // 포인터가 가리키는 메모리의 데이터는 역참조로 수정할 수 없습니다. 1) 함수 매개변수 보호 🎜🎜 (2) 포인터가 읽기 전용 데이터를 가리키는 경우 세그폴트를 방지하기 위해 const도 추가해야 합니다. 🎜🎜 int const * p; // 위와 동일 🎜🎜 int* const p // 포인터 변수의 값은 수정할 수 없습니다🎜

 可以防止指针变量意外变成野指针

    const int* const p; // 既保存指针所指针的内存,也保护指针变量

    int const * const p; // 同上

运行:

*p_num=10
请输入一个数字:1
*p_num是1
*ptr=10

10,注意事项:

空指针:

  • 变量指针的值等于NULL,这种指针叫空指针。

  • 不能对空指针解引用,一定会出现段错误。

  • 当操作重启时会跳转NULL地址,进行重启,因此NULL存储操作系统用于重启的数据。

  • NULL在C语言中是一种错误标志,如果函数的返回值是指针类型,

  • 结果一旦NULL表示函数执行出错或失败。

如何避免空指针造成的段错误?

使用来历不明(函数的参数)的指针前先进行检查,if(NULL == p)。

野指针:指针变量的值不确定,使用野指针不一定会出错。

int* p; // 野指针

使用野指针的后果:段错误。

注意:野指针是无法分辨的,所以比空指针危害更。

如何避免野指针造成的错误?

  • 所有的野指针都人制造出来的,只要人人都不制造野指针就会有野指针造成的错误。

  • 定义指针变量时一定要初始化。

  • 指针变量所指向的内存初始释放后要及时赋值为空(堆内存)。

  • 不返回局部变量的地址。

相关学习推荐:C视频教程

위 내용은 C 언어에서 포인터의 용도는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.