指针的作用:
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);
}