C语言_指针

//
//  main.c
//  C_5_1
//
//  Created by ibokan on 15/12/1.
//  Copyright © 2015年 aishuo. All rights reserved.
//

#include <stdio.h>
void seapValue(int x,int y);
void swapValue1(int *x,int *y);
int main(int argc, const char * argv[]) {
    
    /*
     为什么需要指针?
     1.使用指针处理数组中存储的数据,它的执行速度要比使用,下标块很多,因为下标需要进行
     位移量编转,而指针式直接使用内存地址;
     2.对于基本数据类型来说,我们在函数中无法更改函数调用处之前的局部变量,使用指针就可以做到。
     指针:一个变量的地址为该变量的”指针“.他是个常量
     指针变量:
     指针变量是一个变量,用于存储地址的值。
     
     指针变量的声明:
     数据类型 *指针变量名;
     
    int *p=&i;
     p指向i地址的存储单元(数据)
     
     下面的声明中得* 号表示后面的变量p 为一个指针变量。前面的int 链尾I型表示该指针变量所存储的地址指向的存储单元上是存放一个整形的数据。
     简单的说:就是上面的格式定义了一个指向”数据类型“的”指针变量“
     
     */
    int *p;
    //指针的使用
    //对指针赋值
    int i=10;
    int *p1;//可以将int*看做是一个整体(数据类型),然后p1中需要存储的是地址类型
    p1=&i;  //&是取值(地址)运算符
    //等价于
    //int *p1=&i;
    int *p2;
       //*p2=&i;//优先级考虑*p2对i取值但p2不知道i的地址
    /*
     错误原因:
     *运算符优先级是大于=。首先*p2进行运算,而*p2运算是求出p2所存储地址指向的内存的值。
     而此时p2内存没有数据,所以*p2找不到想要的结果,所以这样是错误的。
     注意:*号称为取值运算符
     
     */
    /*
     *号的用法:
       1.表达式中,*两边都是表达式的话,*号是四则运算的乘法运算
     2.在声明语句中,*表面在后面的变量为一个指针形式的变量
     3.*号如果不在声明语句中,二只是在右面的表达式的话,表明取*号右面变量中所存地址对应内存只能怪的数据(取值)
     */
    int *p3;
    p3=&i;//p3中就有了地址数据
    //*p3=&i;
    //等价于 i=&i;
    //通过指针取值
    int i1=100;
    int *p4;
    p4=&i1;
    printf("%d \n",*p4);
    //在C语言中提供了另一个控制字符串%p,专门用于打印指针的内存地址值,使得所打印的地址是十六进制的
    printf("%p\n",p4);
    //例子
    int m=10;
    int n=20;
//声明两个指针变量
    int *p_i;
    int *p_j;
    p_i=&m;
    p_j=&n;
    printf("m=%d n=%d\n",m,n);
    printf("通过变量修改数据后的值:m=%d n=%d\n",m,n);
    //通过指针修改数据
    *p_i=100;
    *p_j=200;
    printf("通过指针修改数据后的值:m=%d n=%d\n",m,n);
    printf("通过指针修改数据后的值:*p_i=%d *p_j=%d\n",*p_i,*p_j);
    //指针使用进阶
    int  i2=10;
    int *p5;
    int *p6;
    p5=&i2;
    //&和*的优先级是相同的
    &*p5;
    /*
     表达上的含义?
     &和*运算符优先级相等,而且是从右都到左的顺序结构的
     *p5 等于 i2
     &*p5 等于 &i2
     */
    printf("&i2=%p\n",&i2);
    printf("&*p5=%p\n",&*p5);//%p十六进制输出
    *&i2;//实际上就是先取i2地址在获取他的值
    printf("*&i2%d\n",*&i2);
    (*p5)++;
    //现找出p5所存储地址指向的存储单元的值。把值进行自加,p5的地址不变
    *p5++;
    //*(p5=p5+1)和*(p5=p5+(int));加的时数据类型
    //++ 与 * 同一优先级,结合方向是从右向左,所有先找出p5所存储地址的值,然后把该值加加,那么现在p5就不在专项变量i2了;
    //
    printf("%d\n",*p5++);
    //值传递
    int a1=10;
    int b1=20;
    printf("函数外,交换前:a1=%d,b1=%d\n",a1,b1);
    seapValue(a1, b1);
    printf("函数,交换后:a1=%d,b1=%d\n",a1,b1);
    /*
     如果向数组作为函数参数那样,在函数内改变传入局部变量的值狗,在函数外部的局部变量的值对应改变那么应该怎么做?
     我们可以通过指针来作参数,一位指针中存放的同样式地址。在C语言中地址传入成为引用传递。
     
     */
    //指针作为函数参数
    int a2=10;
    int b2=20;
    int *p_a2=&a2;
    int *p_b2=&b2;
    printf("函数外,交换前:*p_a2=%d,*p_b=%d\n",*p_a2,*p_b2);
    swapValue1(p_a2, p_b2);
    printf("函数外,交换后:*p_a2=%d,*p_b2=%d\n",*p_a2,*p_b2);
    
    return 0;
}
void swapValue1(int *x,int *y)
{
    int tmp;
    printf("函数内,交换前:*x=%d,*y=%d\n",*x,*y);
    tmp=*x;
    *x=*y;
    *y=tmp;
    printf("函数内,交换后:*x=%d,*y=%d\n",*x,*y);
}
void seapValue(int x,int y)
{
    int tmp;
    printf("函数内,交换前:x=%d,y=%d\n",x,y);
    tmp =x;
    x=y;
    y=tmp;
    printf("函数,交换后:x=%d,y=%d\n",x,y);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值