概述
*++p、*(++P)
:地址先增再取内容;
*p++、*(P++)
:先取内容再增地址
(*p)++
:内容+1
指针变量自增一次的量和其指向的数据类型有关,若指向的是一个int,地址每次增加一个int型大小的空间,若指向的是一个int数组,则每次增加该int型数组的大小。
int arr[10];
数组名arr表示数组第一个元素的地址,arr、&arr打印出的地址是一样的,&arr表示该数组的首地址
arr+1:地址增加4个字节单位;&arr+1:地址增加4*10个字节单位;
给函数传一个数组参数,数组会退化成指针,失去长度特性;sizeof是操作符,不会使数组退化为指针;strlen获得的是字符串的长度,不包括’ ’,使用strlen配合malloc申请堆空间的时候要记得长度加1.
在使用字符串复制、拷贝、比较函数时,要使用有长度参数的函数,以免内存溢出。
int a=10;
int表示申请一个int大小的内存,a表示该固定内存的名字,a不是地址也不是内容,只是一个名字。
全局变量尽量不要用,不利于多线程;申请的栈空间一定要初始化为0,使用过后的缓冲区也要置0,以免地址拷贝出错(memset)。
常量和静态变量都在全局区,生命周期就是程序的生命周期。若在两个子函数中的两个指针分别指向一样的常量,则两个指针指向同一个全局区中的静态区。不能给null指针和野指针进行内存拷贝,这是非法的。
在子函数中改变父函数中的变量嘚使用上一级的变量来修改,普通变量使用一级指针修改,一级指针使用二级指针修改。不管是开辟普通变量,还是指针变量,亦或是堆空间,我们都要初始化,这是一个好习惯。
//strlen 求字符串长度 不包括'