指针与函数,数组

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 实际加上去的值 1
sizeof(pa指向的数据类型)

    pa 如果指向是int  +4
                short +2
                char  +1
                float +4
                double +8            

3.指针与数组
定义并初始化一个数组
int a[5] = {1,2,3,4,5};

  1. 数组名称 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; //不可以 语法报错

  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 //它是一个指针变量 
上一篇:C/C++题 【含答案和解析】


下一篇:相交链表