C 指针

2019-01-09  本文已影响0人  心悦飞飞

C 指针

每一个变量都有一个内存位置,
每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址.
`指针是一个变量,其值为另一个变量的地址,内存位置的直接地址.`
就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。
指针变量声明的一般形式为:`数据类型 * 变量名称;`
定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。
这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值.
函数指针重要的功能就是实现回调函数、
所谓回调函数就是函数先在某处注册、而在稍后某个需要的地方被调用。
函数指针一般作为函数的参数来使用、可以根据需要传递自定义的函数来实现指定的功能。
` *` : 没有任何特殊含义, 仅仅是为了标识 这是一个指针变量
1.指针只能用于保存地址
2.同一个变量可以有有多个指针 指向他
3.指针的指向可以修改
4.不要访问野指针
5.指针类型 是什么类型,就只能指向什么类型的数据
6. 指针为什么要分类型? 因为当我们使用指针 去取值的时候, 系统就会自动根据指针的类型来确定 应该取多少个字节中的值
int num; // 普通变量     num = 10;
int * p; // 指针变量 , 在64位的编译器下 占用8个字节
p = # // 将num的地址 存储到p这个地址中
"(重点 : p = &num --- *p == num)"
#include <stdio.h>

// 基本数据类型作为函数的参数是值传递, 在函数中修改形参的值 不会影响到 外面实参的值
void base(int num)
{
    num = 55;
}
// 数组作为函数的参数是地址传递,如果是地址传递 在函数中修改 形参的值 会改变影响到外面实参的值
void array(int num[] )
{
    num[1]=120;
}


// 指针就是专门用于保存地址的
void point(int *p) //用什么接收地址? 指针 = 0ff123
{
    *p = 119;
}


int main()
{
    int num1 =100;
    base(num1);
    printf("%d\n",num1 );  //100

    int num2[]={1,2,3};
    array(num2);
    printf("%d\n",num2[1] );  //120

    int num4 = 99;
    int * num3 = &num4;
    point(num3);
    printf("%d\n",num4 );   //119

}
#include <stdio.h>
// int *v1 = &a int *v2 = &b
// *v1 = a *v2 = b
// v1 v2 占用8个字节
void swap(int *v1,int *v2)
{
    int temp = *v1;
    *v1 = *v2;
    *v2 = temp;
}

int main()
{
    // 1.定义一个函数交换两个变量的值
    int a = 10;
    int b = 5;
    printf("交换前: a = %i, b = %i\n",a,b);
    swap(&a, &b);
    printf("交换后: a = %i, b = %i\n",a,b);
    return 0;
}
#include <stdio.h>
int demo(int v1,int v2,int v3,int *p1,int *p2);
int main()
{
    // 1.要求定义一个函数,传递三个值,返回这三个值和,差,平均值
    int a = 10;
    int b = 20;
    int c = 30;
    //    int res = demo(a, b, c);
    //    printf("res = %i\n",res);

    // 点翻译三个变量用于保存计算结果
    int res1 = 0; // 和
    int res2 = 0; // 差
    //    int res3 = 0; // 平均值
    // 我们想要的就是调用完函数之后,和差平均值对应的变量 都被 "修改"为对应的值
    int res3 = demo(a, b, c, &res1,&res2);

    printf("res1 = %i,res1 = %i,res1 = %i\n",res1,res2,res3);

    return 0;
}

int demo(int v1,int v2,int v3,int *p1,int *p2)
{
    int sum = v1 + v2 + v3;
    *p1 = sum;
    int m = v1 - v2 - v3;
    *p2 = m;
    int average = sum / 3;

    // 因为返回的是一个逗号表达式, 而逗号表达式的值 是最后一个表达式的值,所以返回的是average
    //    return sum,m,average;

    /*
    //    return  作用 1.返回值给调用者 2.结束函数
    //    注意点 : return后面不可以写任何语句, 因为执行不到
    return sum;
    printf("---");
    return m;
    return average;
     */
    return average;
}
#include <stdio.h>

int name[]={110,119,120};
void arr(int p[],int num){  // 如果参数为数组、则传入的数组参数是数组的内存地址、并没有将值复制一份给形参、而是直接将实参的地址传递进去
    p[1]=num;
    printf("%p\n",p );     // 获取内存地址 0x10cf86018
    printf("%p\n", &name); // 获取内存地址 0x1055ab018
}
int main(){
    printf("%p\n", &name[0]); // 获取内存地址 0x1055ab018
    printf("%p\n", &name[1]); // 获取内存地址 0x1055ab01c
    printf("%p\n", &name[2]); // 获取内存地址 0x1055ab020
    arr(name,1000);
    printf("%d\n", name[1]); // 1000

}

参考文章列表 特此表示感谢作者的分享、本文仅仅学习使用、欢迎指正!
第08天C语言(09):指针-基本概念

上一篇下一篇

猜你喜欢

热点阅读