第六节 数组与指针

指针的作用:

1,在函数调用的时候,希望通过函数改变某一片内存的时候传入指针类型
2,在函数调用的时候传输一片大数据量内存的时候,传入指针
3,在我们自己手动申请内存的时候,因为没有办法用变量直接引用这一片内存,
   所以用指针记录下来
4,操作底层内存(类似于寄存器),需要用到指针

二维指针的作用:

为了在函数调用的时候,往指针变量里面赋一个地址

数组跟指针的关系:

不一样的地方:
1,数组名就是地址(指向该这片数组内存的地址),
   它的类型是这个数组当中最大个元素类型的地址类型
2,数组名是一个不能更改的指针变量(数组名就是一个常量,不能更改)
3,sizeof侧量大小的时候,数组直接就可以侧量它的内存大小出来了,
   而指针侧量永远都是4字节(系统位数的大小)
4,数组名取地址操作,得出来的地址是数组类型的地址类型

剩下的特性,基本上都是一样的,*跟[]可以互换

const指针:

一般作用于函数参数列表里面,写法一般这么写:const  int  *point;
在函数调用的时候保护传输的地址,只能够读,不能够写,保护这片内存

void *指针:

万能通用指针,void*的指针你需要指定分析方式(强制转换)

内存:

内存千万不要访问越界,如果你越界访问,这段内存是自己程序本身已经拥有的,
可能不会报错,但是运气不好的时候就直接崩溃了
(核心段错误)Segmentation fault (core dumped)

C语言中指针和数组

数组名和char型指针的区别和联系
    1.数组名不是指针;
    2.数组名可以当做一个指针常量使用;
    3.指向数组的指针,就紧紧是一个指针;
    4.当函数形参使用数组名是,其会被转换成一个单纯的指针。

数组与指针的区别:
    数组和指针也是一样,
    指针是一类特殊的变量,主要用途是函数间的传址,
    用这种方式来改变实参内容。

    而数组是用来实现线性表的结构,
    用于把同类对象集中在一起放置

在函数形参中的表现
    在向函数传递参数时,如果实参是一个一维数组,
    那用于接受的形参为对应的指针。
    也就是传递过去是数组的首地址而不是整个数组。
    这么做的原因主要是效率

sizeof和strlen的区别与联系

sizeof(...)是运算符,在编译时计算;strlen(...)是函数,在运行时运算

一、sizeof
        sizeof(...)是运算符,在头文件中typedef为unsigned int,
        其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。

        它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
        由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。
        实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,
        返回值跟对象、结构、数组所存储的内容没有关系。

        具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
        数组————编译时分配的数组空间大小;
        指针————存储该指针所用的空间大小
                (存储该指针的地址的长度,是长整型,应该为4);

        类型————该类型所占的空间大小;
        对象————对象的实际占用空间大小;
        函数————函数的返回类型所占的空间大小。函数的返回类型不能是void。

    二、strlen

        strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。
        当数组名作为参数传入时,实际上数组就退化成指针了。

        它的功能是:返回字符串的长度。该字符串可能是自己定义的,
        也可能是内存中随机的,

        该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,
        直到遇到结束符NULL。

        返回的长度大小不包括NULL; 


1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。 
  该类型保证能容纳实现所建立的最大对象的字节大小。 

2.sizeof是算符,strlen是函数。 

3.  sizeof可以用类型做参数,strlen只能用char*做参数,
    且必须是以''\0''结尾的。 sizeof还可以用函数做参数,比如: 

            short f(); 
            printf("%d\n", sizeof(f())); 

            输出的结果是sizeof(short),即2。 

4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。 

5.  大部分编译程序 在编译的时候就把sizeof计算过了 
    是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 

            char str[20]="0123456789"; 
            int a=strlen(str); //a=10; 
            int b=sizeof(str); //而b=20; 

6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,
  不是类型占内存的大小。 

7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。
  这是因为sizeof是个操作符不是个函数。 

8.  当适用了于一个结构类型时或变量,sizeof 返回实际的大小, 
    当适用一静态地空间数组, sizeof 归还全部数组的尺寸。 
    sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 

9.  数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址, 
        如: 
            fun(char [8]) 
            fun(char []) 

        都等价于 fun(char *) 

在C++里参数传递数组永远都是传递指向数组首元素的指针,
编译器不知道数组的大小,如果想在函数内知道数组的大小,需要这样做: 
进入函数后用memcpy拷贝出来,长度由另一个形参传进去 

    fun(unsiged char *p1, int len) 
    { 
            unsigned char* buf = new unsigned char[len+1] 
            memcpy(buf, p1, len); 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值