xmC语言10

指针

计算机中所有的东西都需要有自己的存储空间,比如你int a=10;printf a的数值呈现出10的步骤是:先去访问存储着a的空间,再将空间中储存的数值10给你呈现出来。每一个空间都有它对应的编号,也可以说是地址,指针就是存储地址的空间的变量

*解引用的作用,指向指针p存储的内容(地址)对应的内容

指针基本法

1.指针的定义 type *name;可以char *p;也可以 int *p;全看你想要什么类型

然后我们 int *p=&a;这里用到了取地址符&,因为p储存的是a的地址嘛;我认为要 int (*p)的原因,是p存储a的地址,*p就相当于把他转化成了整型;或者说p是指针,不是整型,而*p是p指向的内容,这个内容是整型(10)(下面是64进制条件下)

or这么说,最开始定义是 int *p;p=&a;最后简化成了int *p=&a;(我觉得最开始的那个比较好理解,毕竟p存储的就是a的地址,在*的作用下才指向10,变成属于整型的变量)

2.因为指针存储的是地址,所以你改变指针就可以改变变量a的值(他直接改变的就是存储a的空间里的值)有一点绕了,就想象对于0x2246这个盒子,p可以随便把盒子里面的东西展现出来或者替换内容。然后这里也可以看到a和p的地址是不一样的

objectivec 复制代码
#include <stdio.h>
#include <stdlib.h>

int main()
{
//point的大小

int a=10;
int *p=&a;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(*p));
printf("%d\n",sizeof(p));

//指针的使用
printf("%p\n",&a);
printf("%p\n",p);
printf("%p\n",&p);
printf("%d\n",a);
printf("%d\n",*p);
*p=30;
printf("%d\n",a);
    return 0;
}

指针与函数

在前面function函数这一章节中,我们提到了传值和传地址。传值的时候形参改变不会对实参发生影响,但是传地址的时候形参改变实参也跟着改变了。这一点和上面说的也是一样的,就是直接把他那个盒子里面的东西改变掉

objectivec 复制代码
#include <stdio.h>
#include <stdlib.h>
int function1(int a){
return a*a*a;}
void function2(int a){
    a=a*a*a;
}
void function3(int *p){
    *p=*p**p**p;}

int main()
{
    int a=10;
    int *p=&a;
    printf("%d\n",function1(a));
    function2(a);
    printf("%d\n",a);
    function3(&a);
    printf("%d\n",a);
    return 0;
}

可以通过function23来看区别,地址访问就可以改变实参了(function3输入的时候可以是 &a也可以是p哦)

下面这个代码,首先是函数中 i=*a而不是int *i=*a; *a已经是一个整型了,可以直接规定,就像int a=10一样,*a就相当于10了

objectivec 复制代码
void swap(int *a,int *b){
int i=*a;
*a=*b;
*b=i;}
int main()
{
    int a=5,b=10;
    printf("a=%d b=%d",a,b);
    swap(&a,&b);
    printf("a=%d b=%d",a,b);
}

指针与数组

1.访问数组

格式 int a\[\];int*p=a;(这个时候p存储的是数组a第一个变量的地址 ==&a0这样子)他可以用来遍历数组,可以改变数组的某些变量等等

数组就是一个地址(存储了很多变量的空间集合),所以规定的时候出现的是int *p=a; 而不是&a。数组指针指向的都是数组的开头

objectivec 复制代码
#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int a[5]={0,1,2,3,4};
    int *p=a;
    //遍历数组
  for(int i=0;i<5;i++){
    printf("%d\n",*p);
    p++;}
    for(int i=0;i<5;i++){
        printf("a[%d]=%d\n",i,a[i]);
        }
}

在改变数组某些元素值的时候,我尝试用p++来改变a1的值,但是后面遍历的时候a0="a1"并且a0没有了。

可以看到,在第一次遍历的时候,就是*p=a0,之后p++就进入下一个单元;第二次遍历没成功是因为第一次的时候p已经到末尾了,你需要重置回到开头再进行操作

objectivec 复制代码
#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int a[5]={0,1,2,3,4};
    int *p=a;
        for(int i=0;i<5;i++){
    printf("%d\n",*p);
    p++;
    printf("\n");}
    //修改数值
    p=a;
    *p=10;
    p++;
    *p=20;
    p=a;
    for(int i=0;i<5;i++){
    printf("%d",*p);
    p++;
    printf("\n");
    }
}

输出的时候可以用*p也可以用a\[\] 比如输出的时候 *(p+1)=a1

2.字符指针

(这个是我觉得这一part最复杂最难懂的)

char *p3={"hello","ok","name"};

在这里我就不懂为什么char单字符却可以规定出字符串,对于字符指针,他们指向的是数组各个元素的首字母,如果用%s就会从第一个开始读取直到\0,但如果是%c就只输出首字符

objectivec 复制代码
int main()
{
    char p[4]={'a','b','c','d'};
    char *q[4]={"hello","ok","name","free"};
    for(int i=0;i<4;i++){
        printf("%c  ",p[i]);
    }
    printf("\n");
     for(int i=0;i<4;i++){
        printf("%c  ",*q[i]);
    }
    printf("\n");
     for(int i=0;i<4;i++){
        printf("%s  ",q[i]);
    }
}

char是规定单字符,字符串是"字符+\0"的组合形式

查了一下网上说"char*是通过识别首字母和\0构成字符串的"所以对于char *p就可以输出字符串

相关推荐
Scott9999HH4 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区9 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大9 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai10 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜10 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa10 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio