C语言灵魂之旅——指针

指针

指针简介

指针就是存放一个变量的地址的变量,说白了指针就是存放地址的,但指针很神奇可以直接访问内存,编译器通过获得指针即变量的地址就可以改变变量的值(是不是很神奇)
指针变量的声明
基类型 * 指针变量名=一个地址(初始化)
如果定义了指针变量但没有初始化,那该指针就会成为野指针,因为指针可以直接访问内存,野指针会指向你不知道的内存中这样可能会使你的系统崩溃,所以最好不要出现野指针,如果指针没有值就赋为空

int * p = NULL://表示p是一个空指针

两个神奇的运算符 &,*

取地址符:& 取变量的地址,内存空间是很大的编译器只有通过获得变量的地址,才能对该变量进行操作
解引用运算符:
引用这个指针指向变量的值
*

#include <stdio.h>
int main()
{
  int a= 10;
  int * str;
  str = &a;
  printf("a = %d\n",*str);

}

指针的进阶

指针与函数

**为啥要把指针·与函数结合?
当你的自定义函数有多个返回值的时候return就不适用了return只能返回1个值,所以只有指针可以做到
以让两个数从大到小的顺序排序为例
**

#include <stdio.h>
void str(int *x,int *y);//让最大的值排在前面
int main()
{
    int a,b;
    int *p1 = NULL,*p2 = NULL;
    scanf("%d %d",&a,&b);
    p1 = &a;
    p2 = &b;
    if(a < b)
    {
        str(p1,p2);
    }
    else
    {
    printf("%d %d\n",a,b);
    printf("%d %d\n",*p1,*p2);
    }
}
void str(int *x,int *y)
{
    int i;
    i = *x;
    *x = *y;
    *y = i;
}

//指针函数和函数指针
//指针函数是带指针返回值的函数
//函数指针是指向函数的指针变量
函数指针

#include <stdio.h>
int (*p)(int x,int y);
int fun(int x,int y,int (*p)(int x,int y));
int max(int x,int y);
int main()
{
    int a,b;
    printf("请输入两个数:");
    scanf("%d %d",&a,&b);
    fun(a,b,max);

}
int fun(int x,int y,int (*p)(int,int))
{
    int z;
     z = (*p)(x,y);
    printf("%d",z);
}
int max(int x,int y)
{
    int z;
    if(x > y)
    {
        z = x;
    }
    else
    {
        z = y;
    }
    return z;
}
//函数名就是函数的入口地址,只要有函数的入口地址就可以指向函数

我们来分析一下,首先把a,b的地址赋给p1,p2;,在判断如果符合if就调用str()自定义函数,通过交换两个变量的值,来改变主函数a,b的值这就牵扯到了传值和传址的问题:传值就是把实参的值的副本传给形参,形参的改变不会影响实参。传址就不同了,通过操作指针实参的值可能改变

指针与数组

以计算10个数字之和为例

#include <stdio.h>
int main()
{
    int num = 0;
    int a[10];
    int *p = NULL;
    p = a;
    for(p = a;p < a + 10;p ++)
    {
        scanf("%d",p);
        num = num + *p;
    }
    printf("%d",num);
}

c语言规定数组名就是数组的地址所以 p = a;
P++;指针移动,指针移动的字节取决于数组的数据类型

可能其中会有一些错误还望大家指正,如果大家还有关于指针的内容,不要吝啬啊(__) 嘻嘻…

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值