C语言-08C语言的指针(1)

本文详细介绍了C语言中的指针概念,包括指针变量、内存地址、指针定义、取地址与取值操作。讨论了空指针与野指针的区别,强调了指针的兼容性和指针运算的规则。此外,还通过实例说明了指针在数组、常量、地址查找以及排序等场景的应用。
摘要由CSDN通过智能技术生成

指针的概念
指针:指针变量是一个变量(整数),指针存放的内容是一个地址,该地址指向一块内存空间。

内存:
计算机内存最小单位是byte(字节),每一个字节的内存都有一个唯一的编号,这个编号就是内存的地址,编号在32位系统下一个32位的整数,在64位系统下是64位的整数

#include <stdio.h>

int main(){
   

    int a=0;
    char buf[10];
    printf("%p,%p\n",&a,&buf);//取变量地址的意思
    return 0;
}
/Users/Xx/CLionProjects/Struct1/cmake-build-debug/Struct1
0x7ffee1f30b04,0x7ffee1f30b0e

Process finished with exit code 0

0x7ffee1f30b04这里的1个数字就是一个字节,在int类型下,p+1操作,其实是0x7ffee1f30b04+4,移动了一个int的内存大小。


指针的定义:

#include <stdio.h>

int main(int argc,char *argv[]){
   

    int a=1;
    int b=2;
    int *p1=&a;
    //int *p1;
    //p1=&a;
    int *p2=&b;
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
    printf("变量为地址:%d,%d\n",p1,p2);
    printf("--------------\n");
    printf("变量为数值:%d,%d\n",*p1,*p2);
    return 0;
}
变量为地址:6618632,6618628
--------------
变量为数值:2,1

Process finished with exit code 0

int *p=&a;得到变量a的地址,将这个地址赋值给变量p
int p=&a;地址虽然是个整数,地址是个特殊的整数。是不能通过整数来操作的。
int *p1;定义一个指针变量,名字叫p1,它可以指向一个int类型的地址。
&p取地址,取出变量p的地址
*p取值,指针变量指向内存的内容
在这里插入图片描述


区分:int *p=&a;= int *p;p=&a;

*p=100 将100赋值给指针p指向的内存(内容)
p=100 将整数100赋值给变量p(地址),这里是野指针

#include<stdio.h>

int main(){
   

    int buf[10];
    printf("%u,%u,%u\n",&buf,&buf[1],&buf[2]);
    printf("-----------------------\n");
    char buf1[10];
    printf("%u,%u,%u",&buf1,&buf1[1],&buf1[2]);
    return 0;
}
D:\SystemP\bulingbuling\Clion\Prog\cmake-build-debug\Prog.exe
6618608,6618612,6618616
-----------------------
6618598,6618599,6618600
Process finished with exit code 0

数组名字代表数组第一个元素。char类型的数据,其中两两相邻的相差1个字节,与之对应的int类型,两两相差4个字节。


无类型指针:
void *p1;无类型指针,意思是这里只是一个指针,而不指向任何具体的数据类型。


#include <stdio.h>

int main(){
   

    int a1=0;
    int *p1=&a1;
    char a2=0;
    char *p2=&a2;
    printf("%d\n", sizeof(p1));
    printf("%d\n", sizeof(p2));
    return 0;
}
/Users/Xx/CLionProjects/Struct1/cmake-build-debug/Struct1
8
8

Process finished with exit code 0

这里的两个指针的字节数都是为8?
因为:指针本身就是一个地址,32位系统下4字节,64位系统下8字节。


NULL
p3=NULL;将指针赋值NULL,值为NULL的指针->空指针

空指针与野指针:
指向NULL的指针叫空指针,没有具体指向任何变量地址的指针叫野指针。

#include <stdio.h>

int main(){
   

    int a=0;
    int *p;
  //p=&a;
    *p=1;
    printf("a=%d\n",*p);
    return 0;
}

这里的p我们没有赋值给它,它没有指向的地址。对于int *p来说是个未知的值。这里的指针p就是个野指针。程序中要避免野指针的存在,因为野指针是导致程序崩溃的主要原因。


指针的兼容性

#include <stdio.h>

int main(int argc,char *argv[]){
   
    int a=2;
    int b=3;
    int c=4;
    int *p;
    p=&a;
    *p=10;
    p=&b;
    *p=20;
    p=&c;
    *p=30;
    printf("a=%d,b=%d,c=%d\n",a,b,c);
    return 0;
}
a=10,b=20,c=30

Process finished with exit code 0

指针之间赋值比普通数据类型赋值检查更为严格,不可以把一个double赋值给int
原则上一定是相同类型的指针指向相同的类型的变量地址,不能用一种类型的指针指向宁一种类型的变量地址。
在这里插入图片描述

#include <stdio.h>

int main(int argc,char *argv[]){
   
    int a=0x1234;
    char *p= reinterpret_cast<char *>(&a);//数据丢失
    printf("%x",*p);
    return 0;
}
34
Process finished with exit code 0

这里我们看见的输出为34,由于存储在x86下为小端存储,0x1234在char存储的是一个字节中只能读取到34


指向常量的指针与指针变量
指向常量的指针:

#include <stdio.h>

int main(){
   

    int a=10;
    int b
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值