鱼C论坛

 找回密码
 立即注册
查看: 1760|回复: 0

[学习笔记] 指针

[复制链接]
发表于 2019-7-31 20:40:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Julia999 于 2019-7-31 20:40 编辑
#include<stdio.h>

int main()
{
        int *p;  //p是个变量名字,int *表示该p变量只能存储int类型变量的地址
        int i=10;
        int j;
//j=*p;  //错误 野指针
        return 0;
}
指针的定义:
地址:内存单元的编号(从0开始的非负整数)
范围:0----FFFFFFFF【0-4G-1】
指针:指针就是地址,地址就是指针
指针变量就是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数


分类:
1.基本类型的指针
2.指针和数组的关系


基本概念:
int i=10;
int *p=&i;  //等价于int *p; p=&i;
详解这两部操作:
1)p存放了i的地址,所以我们说p指向了i
2)p和i是完全不同的两个变量,修改其中的任意一个变量不改变另外一个
3)p指向i,*p就是i变量本身。更加形象的说就是所有出现*p的地方都可以换成i


注意:
指针变量也是变量,只不过他存放的不能是内存单元的内容,只能存放内存单元的地址
普通变量前面不能加*
常量和表达式前不能加&


区分:
#include<stdio.h>
void f(int i)
{
        i=100;
}
int main()
{
        int i=9;
        f(i);
        printf("%d:",i);
        return 0;
}
上面这个是不能改变i的值的,最后的输出结果仍然是9。因为本质上,这样的操作并不能对i进行修改。
#include<stdio.h>
void f(int *i)  //不是定义了一个名字叫做*i的形参,而是定义了一个形参,该形参的名字叫做i,他的类型是int *
{
        *i=100;
}
int main()
{
        int i=9;
        f(&i);
        printf("%d:",i);
        return 0;
}

如何通过被调函数修改主调函数中的普通变量的值
1.实参为相关变量的地址
2.形参为以该变量的类型为类型的指针变量
3.在被调函数中通过 *形参变量名 的方式就可以修改主函数中的变量




指针和数组:
指针和一维数组:
    数组名
          一维数组名是个指针常量
          他存放的是一维数组第一个元素的地址
          他的值不能被改变
          一维数组名指向的是数组的第一个元素
下标和指针的关系:
a<-->&=*(a+1)
#include<stdio.h>

int main()
{
        int a[5]={1,2,3,4,5};
    //a[3]=*(a+3);
        print("%p\n",a+1);
        print("%p\n",a+2);
        print("%d\n",*a+3);  //*a+3等价于a[0]+3  =4
        return 0;
}
#include<stdio.h>

void Show_Array(int *p,int len)
{
        //p[2]=-1;
        //p[i]就是主函数a[i]
        for(int i=0;i<len;i++)
        {
                printf("%d\n",p[i]);
        }
}
int main()
{
        int a[5]={1,2,3,4,5};
    Show_Array(a,5);  //a等价于&a[0],&a[0]本身就是int *类型
        
        return 0;
}
如果通过被调函数修改主调函数中一维数组的内容【如何界定形参中的两个参数】存放数组首元素的指针变量
存放数组长度的整型变量
#include<stdio.h>

int main()
{
        double *p;
        double x=66.6;
        p=&x;  //x占8个字节,1个字节是8位,1个字节一个地址
    
        double arr[3]={1.1,2.2,3.3};
        double *q;
        q=&arr[0];
        printf("%p\n",q);  //%p实际就是十六进制输出
        q=&arr[1];
        printf("%p\n",q);

        return 0;
}



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 10:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表