C语言指针

指针 2016年7月18日 星期一 19:20

void change(int *v1 ,int *v2)

{

    int temp = *v1;

    // *v1 ==a  *v2 ==b

    *v1 = *v2;

    *v2 = temp;

}

 

int main(int argc, const char * argv[]) {

    int a = 10;

    int b = 5;

    printf("修改前 a = %i b = %i\n",a,b);

    change(&a,&b);

    printf("修改后 a = %i b = %i\n",a,b);

    return 0;

}

Return的作用

1.返回值给调用者

2.结束函数

注意点:return 后面不可以写任何语句,因为执行不到

 

//指针练习

int main(int argc, const char * argv[]) {

    int a = 10;

    int b = 20;

    int c = 30;

    int Rsum  = 0;

    int Rcha  = 0;

    

    int result = test(a, b, c, &Rsum, &Rcha);

    printf("result = %i\n Rsum = %i\n Rcha = %i\n",result,Rsum,Rcha);

    return 0;

}

 

int test(int v1,int v2,int v3, int *p1, int *p2)

{

    int sum = v1+v2+v3;

    *p1 = sum;

    int cha = v1-v2-v3;

    *p2 = cha;

    int pingjun = sum/3;

    return pingjun;

}

指针为什么要分类型

指针为什么要分类型,因为当我们利用指针去取值的时候,系统就会自动根据指针的类型来确定应该取多少个字节中的值

指针和数组

指针类型的两个用途:

1.取值的时候,会根据指针类型所占用的字节去取出对应字节的数据

2.用于做加法运算,指针+1,其实是加上指针类型所占用的长度,如果当前指针类型是int,那么+1本质上就是加上4个字节

 int ages[3] ={1,2,3};

    int *p ;

    p = ages;

    printf("p = %p\n",p);

    p = p + 1;

    printf("p + 1 = %p\n",p);

    p = p + 1;

    printf("p + 1 = %p\n",p);

只要一个指针指向了数组,那么访问数组就有三种方式

int ages[3] ={1,2,3};

    printf("ages[0] = %p\n",ages);

    int *p ;

    p = ages;

    printf("p[0] = %p\n",p);

    printf("ages[0] = %i\n",*(p +0));

 

指针和字符串

//通过数组来保存字符串,那么字符串是一个常量,可以修改,并且存在栈区,相同的字符串会重复分配存储空间

    char str[] = "lxc";

    str[0] = 'm';

    //通过常量来保存字符串,那么字符串是一个常量,不可修改,并且存在常量区,相同的字符串不会重复分配存储空间

    char *str2 = "lxx";

    str2[0] = 'x';

    //通过常量来保存字符串,那

字符串是一个常量,不可修改,并且存在常量区

 

指针注意点:

1.可以用来定义变量

2.可以用来作为形参的值

3.可以作为返回值

注意当返回值为字符串的时候  一定要记住在函数里声明要用声明常量的方法,如果声明成数组

就存在了栈区,出了作用域就会被释放。声明常量的话就存在了常量区,不会被释放。

 

指向函数的指针:

函数也会占用一块内存空间它也有自己的地址函数的地址保存在函数中函数名就是函数的地址 == 数组名就是数组的地址

 

void test()

{

    printf("执行了\n");

    

}

int main(int argc, const char * argv[]) {

    printf("test = %p\n",test);

    void (*funtionp)();

    funtionp = test;//注意不能写成test()   //()表示调用一个函数

    printf("*funtionp = %p\n",*funtionp);

    (*funtionp)();

    return 0;

}

/**

    指向函数的指针的定义格式

 *  : 代表是一个指针

 funtionp : 代表指针变量的名称,区分

 *funtionp : 代表将来指向一个函数

 void : 代表将来指定的函数没有返回值

    ()  : 代表将来指向的函数没有返回值

 */

void (*funtionp)();

 

练习

#include <stdio.h>

int ages()

{

    return 10;

}

void sum(int v1, int v2)

{

    int result = v1 + v2;

    printf("result = %i\n",result);

}

int sum2(int v1, int v2)

{

    int result = v1 + v2;

    return result;

}

int main(int argc, const char * argv[]) {

    int (*ageP)();

    ageP = ages;

    printf("age = %i\n",ageP());

    //age = 10

    

    void (*sump)(int,int);

    sump = sum;

    sum(10, 20);

    //result = 30

    

    int (*sum2p)(int,int);

    sum2p = sum2;

    printf("sum2 = %i\n",sum2(20, 20));

    //sum2 = 40

    return 0;

}

 

练习2

 

#include <stdio.h>

int sub (int v1 , int v2)

{

    return v1 - v2;

}

 

int sum (int v1 , int v2)

{

    return v1+v2;

}

//int (*funtionP)(int ,int)可以理解为 int v3 只不过这个是传递函数,而且调用的时候不可以在后面参数

int demo (int v1, int v2 ,int (*funtionP)(int ,int))

{

    return funtionP(v1,v2);

}

int main(int argc, const char * argv[]) {

    printf("sum = %i\n",demo(20, 10, sum));

    //sum = 30

    printf("sub = %i\n",demo(20, 10, sub));

    //sub = 10

    return 0;

}

posted @ 2016-07-29 13:59  偷吃的喵  阅读(166)  评论(0编辑  收藏  举报