09-C语言指针

2018-09-16  本文已影响0人  低头看云

什么是指针

int num = 6;  // 定义一个普通变量

int *p;  // 定义一个指针变量
// num变量的占用内存最小的那个地址存储到指针变量p中
p = #

int num = 6;
int *p;
p = #   // p指向num地址
printf("&num = %p\n", &num);   // 0028FEBC
// 代表取出p中存储的值
printf("p = %p\n", p);         // 0028FEBC
// &p和普通变量也一样,代表取出各自的内存地址
printf("&p = %p\n", &p);       // 0028FEB8

指针变量的初始化方法

int a = 5;
int *p = &a;
int num = 6;
int *p;
p = #
- - 把指针初始化为NULL
```
int *p = NULL;
int *p = 0;
```
int num = 6;
int *p;
*p = # // 错误写法

指针的大小和指向问题

```
int num = 6;
int *p;
p = #
printf("修改前: num = %i\n", num); // 6
*p = 88;
printf("修改后: num = %i\n", num); // 88
printf("修改后: *p = %i\n", *p);   // 88
```

指针为什么要有类型

int num = 888;
//0000 0000 0000 0000 0010 0010 1011 1000
//int *p;
char *p;
p = #
printf("*p = %i\n", *p); // 888    120(改成char类型会发生数据错误)
image

小例子

#include <stdio.h>
// void change(int value);
int main()
{
    int num = 6;
    printf("调用前: num = %i\n", num);   // 6     6
    // change(num);
    change(&num);
    printf("调用后: num = %i\n", num);   // 6     666
    return 0;
}

//void change(int value){
void change(int *value){
    *value = 666;
}

#include <stdio.h>
void swap(int *num1, int *num2);
int main()
{
    // 需求: 要定定义一个函数, 在函数中交换传入变量的值
    int a = 4;
    int b = 6;
    printf("a = %i, b = %i\n" ,a, b);  // 4   6
    swap(&a, &b);
    printf("a = %i, b = %i\n", a, b);  // 6   4
    return 0;
}

// 传入的地址,则会修改实参
void swap(int *num1, int *num2){
    int temp = *num1;
    *num1 = *num2;
    *num2 = temp;
}

image
#include <stdio.h>
void test(int a, int b, int *c, int *d,int *e,int *f);
int main()
{
    //要求定义一个函数,可以同时返回两个变量的和, 差, 积, 商
    int a = 10;
    int b = 20;

    int c, d, e, f;
    test(a, b, &c, &d, &e, &f);
    printf("和 = %i\n", c);
    printf("差 = %i\n", d);
    printf("积 = %i\n", e);
    printf("商 = %i\n", f);

    return 0;
}

// 注意点:return的作用是用于结束当前函数,return后面的代码执行不到;
// 可以通过操作指针,实现地址的传递;来实现多个返回值;
void test(int a, int b, int *c, int *d,int *e,int *f){
    *c = a + b;
    *d = a - b;
    *e = a * b;
    *f = a / b;
}

二级指针

int num;
num = 6;

// 一级指针
int *p;
p = &num;

// 二级指针
int **pp;
pp = &p;

int num;
num = 6;

// 一级指针
int *p;
p = &num;
printf("p
= %i\n", *p);

// 二级指针
int **pp;
pp = &p;
printf("pp = %i\n", **pp);   // 6

image

指针和数组

int ages[3] = {1, 3, 5};
int *p = &ages;   // p = ages = &ages;
#include <stdio.h>

int main()
{
    int ages[3] = {1, 3, 5};
    for(int i = 0; i< 3; i++){
        printf("ages[%i] = %i\n", i, ages[i]);
    }
    printf("------------------------\n");
    int *p = &ages;
    for(int i = 0; i < 3; i++){
        //printf("agee[%i] = %i\n", i , *p++);
        printf("agee[%i] = %i\n", i , p[i]);
    }

    return 0;
}
int ages[3] = {1, 3, 5];
int *p = &ages;
// ages[0] = 8;
p[0] = 88;
int ages[3] = {1, 3, 5};
// 1.第一种
printf("ages[0] = %i\n", ages[0]);  //   1
// 2.第二种
int *p = ages;
printf("p[0] = %i\n", p[0]);   //    1
// 3.第三种
printf("0[p] = %i\n", 0[p]);   //   1
int nums[3] = {1, 3, 5};
int *p = &nums;  // 等同于   int *p = nums;
printf("*p = %i\n", *p);  // 1;
printf("*(p + 1) = %i\n", *(p + 1)); //   3   
printf("*(p + 2) = %i\n", *(p + 2)); //   5
printf("*p = %i\n", *p);  // 1;
// 此时p还是执行nums[0]的地址

printf("*p = %i\n", *p++);  // 1;
printf("*p = %i\n", *p++);  // 3;
printf("*p = %i\n", *p);  // 5;
printf("*p = %i\n", *(--p));  // 3
// 指针先++,再取出里面的内容;

指针和字符串

char str1[] = {'c','w','w','\0'};
char str2[10] = {'c','w','w'};
char str3[] = "cww";
//    printf("str1 = %s\n",str1);   // cww
//    printf("str2 = %s\n",str2);   // cww
//    printf("str3 = %s\n",str3);   // cww

// 注意下面写法是错误的
char *str4 = {'c','w','w','\0'};
printf("str4 = %s\n",str4);   // 罢工

指向函数指针

- 数组名保存的就是数组的地址,同样,**函数名中保存的就是函数的地址**
    - 如果是数组,我们可以直接将数组名称赋值给一个指针变量
    - 如果是函数,我们也可以直接将函数名称赋值给一个指针变量
   
```
#include <stdio.h>
void test();
int main()
{
    test();
    printf("test = %p\n", test);  //  00401672
    printf("&test = %p\n", &test);  //  00401672
    return 0;
}

void test(){
    printf("test\n");
}

``` 
#include <stdio.h>
void say();
void sum(int a, int b);
int minus(int a, int b);
char* test();
int main()
{
    // 指针指向函数的练习

    // 1.
//    void (*p1)();
//    p1 = say;
//    p1();


    // 2.
//    void (*p2)(int , int);
//    p2 = sum;
//    p2(10, 20);


    // 3.
//    int (*p3)(int, int);
//    p3 = minus;
//    int res = p3(30,20);
//    printf("res = %i\n", res);


    // 4.
    char* (*p4)();
    p4 = test;
    char* res = p4();
    printf("res = %s\n", res);

    return 0;
}


void say(){
    printf("Hello World!\n");
}

void sum(int a, int b){
    printf("sum = %i\n",a + b);
}

int minus(int a, int b){
    return a-b;
}


char* test(){
    char *name = "cww";
    return name;
}


#include <stdio.h>
int sum(int a , int b);
int minus(int a, int b);
int test(int num1, int num2, int (*func)(int ,int));
int main()
{

    int (*p1)(int ,int);
    p1 = sum;
    // p1 = &sum;  // 二者写法一致;
    int res1 = p1(10, 20);
    printf("res1 = %i\n", res1);   // 30

    p1 = &minus;
    int res2 = p1(10, 20);
    printf("res2 = %i\n", res2);   // -10

    int res3 = test(10, 20, sum);
    printf("res3 = %i\n", res3);   // 30

    // int res4 = test(10, 20, &minus);
    int res4 = test(10, 20, minus);
    printf("res4 = %i\n", res4);    // -10

    return 0;
}

/*
    指向函数的指针,作为函数的形参时,指针变量的名称, 就是形参的名称
    如果指向函数的指针作为函数的参数,那么这个可以称之为回调函数;
    这里相当于,给test函数传入了一个sum或minus函数
    然后又在test函数中调用了一个sum函数或者是minus函数
*/
int test(int num1, int num2, int (*func)(int ,int)){
    return func(num1, num2);  
    // return (*func)(num1,num2);
}

int sum(int a , int b){
    return a + b;
}

int minus(int a, int b){
    return a -b;
}

image image
上一篇下一篇

猜你喜欢

热点阅读