데이터 구조는 (1) (C ++) _ 포인터 노트

데이터 구조의 I. 개요

       1. 정의 :

    우리가 어떻게 특정 기능을 달성하기 위해 특정 데이터 유형과 메인 메모리 (RAM)에 특정 저장 구조에 저장, 현실과 복잡한 문제를 많이 넣어,이 기준으로 할 (예 : 요소를 찾는 등의 제거 정렬 전체) 요소의 요소와 대응하는 동작을 수행. 해당 동작은 알고리즘을 호출한다.

         + = 데이터 구조와 관련하여 개별 제목

         알고리즘 (좁은) = 저장된 데이터 연산

  알고리즘 2 : 방법과 절차를 해결

          2.1 알고리즘은 품질 기준을 측정 :

      :. 2.1.1 시간 복잡도 프로그램 에 대한 사형 집행의 수는 실행되지 시간

      2.1.2 공간 복잡성 : 알고리즘의 실행 중에 아마 가장 큰 메모리를 점령하다

      2.1.3. 어려움의 정도 (ED 알고리즘 가장 중요한)

      2.1.4. 견고성

       데이터 구조의 3 상태 : 데이터 구조는 핵심 교과 과정 소프트웨어에

         동작 언어 기억 프로그램 데이터 = 데이터 + + 컴퓨터에 의해 실행될 수있다

 둘째, 사전 지식

  1. 포인터

    1.1 포인터의 중요성 : 포인터는 C 언어의 영혼이다

    포인터의 개념의 정의는 1.2 :

      주소는 주소 포인터 포인터 포인터입니다, 그리고 주소는 개념이다

      포인터 변수는 상기 셀의 메모리 어드레스를 저장하기위한 변수이고, 소위 메모리 셀은 상기 메모리 어드레스 단위 번호 두 개념은

      포인터의 특성은 0과 음이 아닌 정수 제한된 운전 / 비 - 음의 정수이고          

        범위 : 0 - FFFFFFFF [4G-1]

        메모리와 CPU 사이의 관계 1.2.1 :

          CPU가 직접 메모리가 CPU 고유 대용량 저장소에 액세스 할 수 있으며, 단지 메모리를 액세스 할 수있는 메모리의 기본 단위는 바이트 분할되고, 각각의 바이트는 8 비트, 0 또는 1 인 (1), CPU 기억 각을 갖는다 주소, 제어 라인, 데이터 라인 : 메모리 처리

          이 4G-0에서 1로 번호가 32 비트 인 경우, 메모리의 작은 격자를 많이 볼 수있다;

          . 1.2.1.1 어드레스 라인은 어드레스 번호가 조작부 번호가 아니라 어드레스 번호의 어느 결정될 수 어드레스 선 초점 어드레스 라인은 32 비트이므로 때문 만 0 32-1에 최대, 번호 메모리 그것은 반복되지 않을 수 있지만, 내용이 반복 될 수있다;

            정의 : 주소는 메모리 셀의 수, 세포 수, 죽은 변경할 수 없습니다 만, 내용은 내부 변경 될 수 있으며, 프로그램이 실행 완료되면, 메모리는 운영 체제가 메모리를 할당합니다, 재활용 및 파괴는 개념이 아니다 (재활용됩니다 프로그램으로,이 프로그램은 운영 말한다 파괴하지 않는 시스템, 운영 체제가 메모리 공간이 해제됩니다, 원본 데이터 (디지털 기존의 폐기물을)하지만 (이 문제의 C를 사용할 수 있지만 자바, 자바는 것이다 자동 변수가 클리어 될 릴리스)이지만, 메모리 셀의 수는 여전히 존재한다;

          . 1.2.1.2 제어 라인을 결정하기 위해 사용되어, 읽기, 쓰기, 읽기 전용, 쓰기 전용,

          1.2.1.3. 데이터 전송을위한 데이터 선

  2. 포인터 분류 :

    지표의 2.1 기본 유형

      2.1.1 기본 개념

 1 #include <stdio.h>
 2 
 3 int main(void)
 4 {
 5     int * p;    //该p变量只能存储int类型的地址,不能存放一个整数
 6     int i = 10;
 7     int j;
 8 
 9     // char ch = 'A';
10     // p = &ch;    //p只能存放int类型,不能存放char类型的'A',类型不一致,会报错
11     // p = 10; //error p是个变量名字,表示只能存放int型变量地址,10是个整数,不是个地址;
12     // *p = i;        //可以存放i,一定要如下理解才可以
13                 // 1)将i的地址发送给p,意味着p是指向i的;
14                 // 2)修改p、i的值,不会影响另外一个值,相互不会影响;
15                 // 3)*p即为i变量本身,i跟*p可以在任何地方进行互换,i的值改了,*p的值也改了,i原来等于100,*p也就等于100,但是p不是i,i不是p;
16     p = &i;     // 如果这一行被省略掉,会报错;
17                 // 第一步int * p;只是说p可以保存整型变量地址了,但p中并没有保存真正的整型变量地址,所以我们不知道*p真正指向的是谁了
18                 // 虽然p中没有保存真正有效整型数字地址,但是p中还是可以有垃圾数字的,垃圾数字也有可能是某一个变量的地址,所以*p最终指向的是一个不确定的单元,*p不知道指向了哪里,造成了混乱,c语言中不允许这样去写
19                 // 不能将一个不确定单元的值,赋给另外一个变量,这样不合适,所以会报错
20     *p = i;        // 等价于i=i,不会出错,但是没有什么实际意义
21     j = *p;    // 等价于j = i; 若注释掉这一行,则j没有赋值,c会自动赋予一个垃圾数字-2341343;
22     printf("i =  %d, j= %d, *p = %d\n",i, j, *p);
23 
24     //printf();
25     return 0;
26 }
View Code

 

小结:

    1、如果一个指针变量(假定为p)存放了某个普通变量,那我们就可以说:“p指向了i”,但p与i是两个变量;修改p的值不影响i的值,修改i的值不影响p的值

    2、*p等价于I 或者说*p可以与i在任何地方互换

    3、如果一个指针变量指向了某个普通变量,则*指针变量就完全等价于该普通变量

注意:

       指针变量也是变量,只不过它存放的不能是内存单元的内容,只能存放内存单元的地址

       普通变量前不能加*

       常量和表达式前不能加&

如何通过被调函数,修改主调函数中普通变量的值

1.实参为相关变量的地址:&i

2.形参为以该变量的类型为类型的指针变量:*p

3.在被调用函数中通过*形参变量名的方式修改主函数:*p=100


    2.2.指针和数组的关系(一维数组)

//Array_point_1.cpp
# include <stdio.h>

int main(void)
{
    int a[5] = {1,2,3,4,5};    // 1)a中存放的不是1~5这5个数字,这5个数字是在a0到a4中存放的。
                            // 2)数组名a存放的是数组的第一个元素的地址
                            // 3)它的值不能被改变
                            // 4)字母a即为一维数组名,指向的是数组的第一个元素,即a指向的是a0
                            // 5)a[3]和*(a+3)的关系:a[i] <<==>> *(a+i) 即数组a[i]的写法,等价于*(a+i)    a[3] == *(3+a), 3[a] == *(a+3), 因a指向第一个元素a[0],故a+3指向第四个元素a[3],则*(a+3)==a[3];
                            // 理论上指针比下标的速度快,但是可以忽略不计
    //a[3] == *(3+a);
    
    printf("%p\n", a+1);
    printf("%p\n", a+2);
    printf("%p\n", a+3);

//[Out]:
//0019FF30
//0019FF34
//0019FF38
    
    printf("%d\n", *a+3);  // *a+3等价于 a[0]+3 = 4
//[Out]:
// 4
    return 0;
}
View Code

      2.2.1.数组名:a[*]中的a

        一维数组名 是个指针常量,它存放的是一维数组第一个元素的地址a[0],它的值不能被改变

        一维数组名指向的是 数组的第一个元素

      2.2.2.下标和指针的关系:a[i]等价于*(a+i)

        a[i] <<==>> *(a+i)

        假设指针变量的名字为p,则p+i的值是p+i*(p所指向的变量所占的字节数)

      2.2.3.指针变量的运算:

        指针变量不能相加,不能相乘, 不能相除,如果两指针变量属于同一数组,则可以相减

        指针变量可以加减一整数,前提是最终结果不能超过指针

          p+i 的值是p+i*(p所指向的变量所占的字节数)  

          p- i 的值是p-i*(p所指向的变量所占的字节数)

          p++ <==> p+1  // 如果是int型,就是4字节,double型,就是8字节,但是都是指向的后一个元素

          p-- <==> p-1

      2.2.4.举例:

        如何通过被调函数修改主调函数中一维数组的内容[如何界定]

          两个参数:1)存放数组首元素的指针变量;2)存放数组元素长度的整型变量

//Array_point_2.cpp
# include <stdio.h>

void Show_Array(int * p, int len)    // a发送给了*p
{
//    p[0] = -1;    //p[0] == *p
//    p[2] = -1;    //p[2] == *(p+2) == *(a+2)  p[i]就是主函数的a[i]
    int i = 0;

    for (i=0; i<len; ++i)
        printf("%d\n", p[i]);
}

int main(void)
{
    int a[5] = {1,2,3,4,5};

    Show_Array(a, 5);    // a等价于&a[0], &a[0]本身就是i
                        // 通过写一个数组名,数组长度,就可以确定一个数组, 
                        // 要想通过一个函数,访问另一个函数中的一个数组,只需要知道这个数组的首地址(数组第一个元素地址)和长度,
                        // 在另一个函数中就可以任意访问、修改主函数a[5]的值
//[Out]:1 2 3 4 5    

//    printf("%d\n", a[2]);
//[Out]: -1
//    printf("%d\n", a[0]);
//[Out]: -1
    
    return 0;

}
View Code

 

추천

출처www.cnblogs.com/wangxue533/p/11745395.html