首页 > 其他分享 >C语言:指针基础指导

C语言:指针基础指导

时间:2024-12-06 22:27:52浏览次数:7  
标签:int 指导 C语言 地址 存放 printf 类型 指针

1:任何一个地址变量,在没有被赋值之前,没有得到实际的变量地址之前,不能通过*去访问任何数据。

一. 理解一个变量的存储过程和原理(必须清楚掌握)

1、两个操作:

(1)int a:

在栈中定义了一个变量a,并且在内存中开辟了一个int类型大小的空间, 即4个字节 ,然后让a指向这篇空间,也就是这篇空间,计算机分配给了a, a以后就有了一片属于自己的空间;

(2) a = 5:

在a的自己的那片空间,里面存放数值5 ,把5转换成二进制,存到a的4个字节的空间 。

2、利用输入流,手动赋值

scanf("%d",&a);

我们还有过输入赋值操作,刚好可以证明上述观点:

用户输入了一个int类型的数值,比如输入5,然后&a,先找到a的那片地址空间,最后把5转成二进制,存入a的那片地址空间,即完成了对a的赋值,也就是在a的那片4字节的空间填入了二进制的5;

3、总结

从上述讲述我们可以了解,一个变量的存储,先从内存开辟一个类型大小的空间(int类型4个字节大小),在让变量指向这篇空间,即就是这片空间属于这个变量,再在这片空间中存储你要存储的数值。

二. 指针类型(int *)的存储过程和原理

1、指针类型的赋值规范

(1) 第一种先定义后赋值
int *p;
p = &a;///这种方式正确
printf("p = $d\n”, p);

结果:p = 6618636

变量p存放的a的地址

重点:

先了解,指针类型,int *p,虽然是*p在一起写着,但是变量名叫p,类型为int *,也就是整型的指针类型,当你理清变量名和类型之后,你对指针的理解程度已经懂了大半了 。

(2)第二种定义赋值一步完成
int *r = &a;
printf("r = %d\n", r);

结果:r = 6618636存放的是a的地址

还有一种常用的错误赋值方法:

// p = a;//这中赋值方式错误

错误的操作,不能把一个具体的数字赋给指针(类型不匹配),

一个指针类型,一个int类型

2、指针存储过程和原理

  • 可以把存放一个int类型变量的地址赋给一个int *指针类型的变量
  • '='左边是一个int *指针类型的变量 ,可以存放放置着int类型数值的地址
  • '='右边是&a,a是int类型的变量数值5,&是取地址符,&a就是拿到int类型a的数值的地址     
  • 总的来说,就是把a的那片空间,给了p一个钥匙,让p也可以对a的那片空间操作,这个已经属于指针操作了,后面我们会讲到。

由上述可以证明,c语言的赋值,必须是类型对应(p是int*类型,&a是int*类型,a是int型)

例如:

int a = 5;
int *p;
p = &a;

 这里a是一个int类型的变量,存放的int类型的数值5

p是int*类型

&a 取到了存放int类型a的地址,是int*类型

根据等号左右类型相同规则,p = &a; 把int类型a的地址赋给了int *类型的p

即就是int *类型的变量可存放一个int数据的地址

三. 指针类型(int **)的存储过程和原理

int **q;
p = &p;
printf("q = %d\n", q);

结果:q = 6618624存放的p的地址

int *p明白了,那么int **q呢?

首先: 先对数据类型和变量划分开

int **q; 变量名为q,数据类型为int **

int *中存放的是int类型数据的地址

int **中存放的是int类型数据的地址的地址

上述我们明白了,一个*是指一个int数值的地址,

p中存放的是个int数值的地址,p = 6618636,为a的地址。

那么我们可以推到,两个*q就是存放p的地址。

p存放a的地址,p本身也是一个变量,他的值为a的地址 ,

而内存也给他自己开辟了一片空间,让他存放而他的数值

q存放p的地址,q也是一个变量,

他们的指向关系如下 :

a<----p<----qk

四. 指针类型(int ***)的存储过程和原理

int ***m;
m = &q;
printf("m = %d\n,m");

结果:m = 6618616存放的q的地址

既然,int *和int **都懂了,那么int ***就迎刃而解了

同理,int*** 存放的是int **类型数据的地址

五. 指针操作(*操作)

printf("p = %d\n",p);
printf("*p = %d\n",*p);
printf("q = %d\n",q);
printf("*q = %d\n",*q);
printf("**q = %d\n",**q);
printf("m = %d\n",m);
printf("*m = %d\n",*m);
printf("**m = %d\n",**m);
printf("***m = %d\n",***m);
p = 6618636
*p = 5
q = 6618624
*q = 6618636
**q = 5
m = 6618616
*m = 6618624
**m = 6618636
***m = 5

标签:int,指导,C语言,地址,存放,printf,类型,指针
From: https://blog.csdn.net/weixin_72011965/article/details/144247323

相关文章

  • C语言第六部分(循环结构)
    C语言循环结构什么是循环代码的重复执行,就叫做循环。循环的分类无限循环:其实就是死循环,程序设计中尽量避免无限循环。程序中的无限循环必须可控。有限循环:循环限定循环次数或者循环的条件。循环的构成循环条件循环体当型循环的实现特点:先判断,后执行,如果条件不满足,......
  • 初探C语言|浅谈函数的递归
    文章目录1.什么是递归?2.递归的两个必要条件代码示例3.两个例题(阶乘和斐波那契)发现问题为什么呢?stackoverflow(栈溢出)常规写法(迭代)4.递归与迭代相比较欢迎讨论:如有错误或不足,欢迎指正和建议,本人主打“听劝”。当然,如有疑问,也期待你在评论区留言互动。点赞+关注:如果......
  • 类、结构体、指针、引用
    1.类与结构体类的定义:classPerson{ private: intage,height; doublemoney; stringbooks[100]; public: stringname; voidsay() { cout<<"I'm"<<name<<endl; } voidset_age(intage1) { if(age1>=0&&......
  • (王道练习代码仓库)408考研真题2022 年42题————C语言
    题目:代码实现:#include<stdio.h>#include<stdlib.h>#include<time.h>#include<string.h>typedefintElemType;typedefstruct{ ElemType*elem; intTableLen;}SSTable;voidST_Init(SSTable&ST,intlen)//申请空间,并进行随机数生成{ ST.Ta......
  • 学习C语言升级c++的笔记
    此篇文章在2022年2月8日被记录,工作这两年多了,也没用过C++做开发,令人唏嘘1、#include<cmath>#include<cstdio>用这种方法来调用C语言中的函数2、namespace名字空间,防止命名重复::叫做限定调用符usingnamespaceX:引入整个名字空间usingX::name使用单个名字X::na......
  • 15-指针
    15-指针内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。【注】内存......
  • c语言题目 之 杨氏矩阵
    杨氏矩阵,就是行和列里面的值都是越来越大的;第一种:通过结构体将坐标带回第二种:通过指针将坐标带回//方法一:structpoint{ intx; inty;};structpointserch_(int(*p)[4],intr,intc,intn){ intx=0; inty=c-1; structpointrety={-1,-1}; ......
  • C语言实验 二维数组
    时间:2024.12.6一、实验7-1矩阵运算代码 #include<stdio.h>intmain(){inta[20][20]={0};intn,i,j;intsum=0;scanf("%d",&n);for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%d",&a[i][j])......
  • C语言:assert断言(如何让程序在不满足条件时报错)
    目录简介如何使用简介assert()是包含在assert.h头文件的宏,用于在运行时确保程序符合指定的条件,如果不符合条件,就报错并终止运行。这个宏被称为“断言”例子:assert(a>b);这个代码的作用就是,如果程序运行到该行代码时,不满足a>b这个条件的话,程序便会报错并停......
  • 【C语言】在 Linux 终端编写、编译并运行 Hello world 程序
    步骤创建并打开hello-world文件夹mkdirhello-worldcdhello-world使用vim创建main.cvimmain.c写入代码并保存#include<stdio.h>intmain(){printf("Hello,world!\n");return0;}#include<stdio.h>是一个预处理命令,用于包含标准输入输......