1.指针与函数
1.1指针作为函数的形参
如果在子函数中拿到了a b 变量的地址,对a b 为所欲为
总结:要子函数中改变变量本身的值,要将变量的地址当作参数传递给子函数
1.2.指针作为函数的返回值
就是函数的返回值是一个指针,这个返回的指针是有限定的
不能将函数内局部变量的地址作为返回值
只能返回未释放的变量对应内存的地址
静态局部变量
全局变量
静态全局变量
2.指针的运算
指针可以和一个整数做加减运算,简称地址运算,不会讨论的乘除运算,没有意义。
指针运算的特点
1)如果是char*或者unsigned char *指针 +1,实际加上去的值就是1
例如: char c = ‘m’;
char *pa = &c; //假如c的地址为0x1000;
pa++; // pa = pa+1; //0x1001
2) 如果是short *或者unsigned short *指针 +1, 实际加上去的值是2
short n = 123;
short *pa = &n; //假如n变量的地址为0x1000
pa++; //0x1002
3) 如果是int *或者unsigned int *指针 +1, 实际加上去的值是4
int i = 0;
int pc = &i; //如果i变量的地址为0x1000
pc += 1; //0x1004
普通变量+1 就是+1
int a=100;
a +=1 ; //101
规律:指针变量做加减运算和其指向数量类型密切相关
pa + 1 实际加上去的值 1sizeof(pa指向的数据类型)
pa 如果指向是int +4
short +2
char +1
float +4
double +8
3.指针与数组
定义并初始化一个数组
int a[5] = {1,2,3,4,5};
-
数组名称 a 其实就是一个指针,就是数组的首地址
2)数组名称 a 它是一个常量指针,不能再次赋值
5= 100;//语法错误的普通的指针变量 pa;
pa++;//可以的 因为他是变量 可以修改
a++; //相当于5++ 语法上报错
3)a[2],它表示是数组中第2个元素
&a[2], 它表示的就是数组中第2个元素的地址
a+2, 它也表示数组中第2个元素的地址
// +2 实际加上去的值 2*sizeof(int)a=a+2; //不可以 语法报错
-
a[2] *&a[2] *(a+2) 三者之间是等价的
[]运算符本质上做了两步运算,gcc对其进行翻译时
第一步:先根据数据名和下标获取到第2个元素的首地址 a+2
第二步:根据获取到的第二个元素的地址 获取它的值 *(a+2)
总结:数组既可以通过数组名加下标方式访问
也可以通过指针方式访问
访问方式: a[2] *(a+2) *(pa+2) pa[2] 之间是等价的
例如:
int a[5] = {1,2,3,4,5};
int *pa = a; //pa中保存了数组的首地址
*(pa+2) = 100; 等价于 a[2]=100;
区别在于:
a) a是常量 不支持修改其值 = ++ --不支持
a = 0xbfc000; //错误
a++; //错误 常量不改其值 5++
--a; //错误的 常量不能改
pa 是变量,其值是可以修改的
b) a代表的是数组
sizeof(a) 得到的是整个数组一共占据内存空间大小
pa本身是一个指针变量 其中存储了数组a的地址
sizeof(pa) = 4 //它是一个指针变量