首页 > 其他分享 >48.C语言初阶指针整理

48.C语言初阶指针整理

时间:2024-05-24 20:18:12浏览次数:13  
标签:10 arr 初阶 48 int C语言 char printf 指针

先来简单的了解指针

image

可以说地址即是指针
通过指针(地址)能找到以它为地址的内存单元
存放于指针中的值都被当成地址处理

一个简单的指针
int a=10;
int* p=&a;
    int a = 1;
    int *pa = &a;
    char *pc = &a;
    //取出地址一样
    printf("%p\n", pa);
    printf("%p\n", pc);

那既然输出的地址一样 那还区分char和int类型干嘛

#include<stdio.h>

int main() {
    int a = 0;
    int *pa = &a;
    char *pc = &a;
    printf("%p\n", pa);
    printf("%p\n", pa + 1);
    printf("%p\n", pc);
    printf("%p\n", pc + 1);
}

image

这样我们就很清楚的看到类型的作用:
即指针类型决定指针解引用能够访问空间的大小
不妨测试下:

指针变量的大小都一样 主要是访问空间的大小不同
    //64位机器上 一个指针变量大小为8个字节
    //32位机器上 一个指针变量大小为4个字节
    printf("%d\n", sizeof(char *));
    printf("%d\n", sizeof(int *));
    printf("%d\n", sizeof(float *));

常用的:

  1. int 4个字节
  2. char 1个字节
  3. double 8个字节
  4. float 8个字节

再看具体例子:

 int arr[10] = {0};
    //数组名为数组首元素的地址
    int *p = arr;
    //若改成char 只修改了总共10个字节
//    char *p=arr;
    int i = 0;
    for (i = 0; i < 10; ++i) {
        *(p + i) = 1;
    }
    for (int i = 0; i < 10; ++i) {
        printf("%p\n", arr[i]);
    }

image

image

可以看到改为char*后只能 向后修改10个字节 因为char类型的作用


野指针

简单来说就是指针指向位置是不可知的 就是瞎**乱指
三种情况:

#include<stdio.h>

int *fun();
static int b;
int a;
float c;

int main() {
    //指针不初始化 就是一个随机值 野指针
    int *p;
    printf("%d\n", a);
    printf("%d\n", b);
    printf("%f\n", c);
    printf("%p\n", p);

    //指针越界访问 野指针
    int arr[10] = {0};
    int *pp = arr;
    int i = 0;
    for (i = 0; i < 12; ++i) {
        *pp + 1;
    }

    //指针指向了已经释放的内存空间 野指针
    int *ppp = fun();
    *ppp=20;
}

int *fun() {
    int a = 10;
    return &a;
}

如果要避免就对应上述三种情况避免 就是规范写法


指针的运算:

  • 指针+-整数
  • 指针-指针
  • 指针的关系运算(比较大小)

这里穿插个知识 随着下标增大 对应地址也变大

    //打印数组
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int n = sizeof(arr) / sizeof(arr[0]);
    int *p = arr;
    for (int i = 0; i < n; ++i) {
        printf("%d ", *p);
	//指针p+1
        *p += 1;
    }
#include<stdio.h>

#define value 5

int main() {
    //将数组values元素全赋值为0
    float values[value];
    float *vp;
    for (vp = &values[0]; vp < &values[value];) {
        //分号";"后没有vp++ ====》先算赋值运算   然后vp++
        *vp++ = 0;
    }
    printf("\n%d\n", *vp);
}
#include<stdio.h>

int main() {
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    //得到的是中间元素个数
    printf("%d", &a[9] - &a[0]);
}
规定比较只可与最后一个元素之后进行比较

指针和数组

还是要说到关于数组名首元素地址的问题:

    //关于元素首地址
    int arr[10] = {0};
    printf("%p\n", arr);
    //加了4
    printf("%p\n", arr + 1);

    printf("%p\n", &arr[0]);
    //加了4
    printf("%p\n", &arr[0] + 1);

    //&arr整个数组的地址
    printf("%p\n", &arr);
    //加了40 跨过了一个数组
    printf("%p\n", &arr + 1);
就两个例外: 1. &arr 取出整个数组地址 2.sizeof(arr) 表示整个数组大小
    //指针数组 存放指针的数组
    int x = 10, y = 20, c = 30;
    int* ok[3]={&x,&y,&c};
    for (int i = 0; i < 3; ++i) {
        printf("%d ",*(ok[i]));

二级指针
int* pa :	*pa告诉是个指针  int 告诉指向对象类型为int
    int a = 10;
    int *p = &a;
    int **p2 = &p;
    printf("%d\n", **p2);
    **p2 = 50;
    printf("%d\n", a);

标签:10,arr,初阶,48,int,C语言,char,printf,指针
From: https://www.cnblogs.com/gaodiyuanjin/p/18211597

相关文章

  • C语言----深入理解指针(3)
    1.字符指针变量//intmain()//{//charch='w';//char*pc=&ch;//printf("%c",*pc);//return0;//}/*intmain(){//char*p="abcdef";//chararr[]="abcdef";//常量字符串abcdef\0//......
  • C语言---试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?
    #include<stdio.h>intmain(){intn,x;scanf("%d%d",&n,&x);intcount=0;for(inti=1;i<=n;i++){intm=i;//从1开始计算while(m)//循环运行的条件{if(m%10==x)//如果m除以10的余数是x的......
  • 新定义RD8T36P48使用USCI0的TWI功能点亮OLED
    时间不多,因此先只给出工程,等有时间再添加详细说明现象这是从之前的一个51单片机的程序移植过来的,主要修改了IIC启动和停止,以及数据发送的代码,我现在还不是很满意的一点是发送过程中要等待上一个字节发送完才能接着发送本次字节。我使用的是while循环等待发送完成标志位,......
  • 新定义RD8T36P48点亮LED--汇编
    其实汇编和C语言差不多,简单的东西用汇编挺好,中等及以上复杂度的程序还是C语言更灵活直接在keil新建好工程,选好芯片型号和下载方式,再创建一个.asm文件并添加到工程,工程创建完如图工程配置代码 ORG0000H LJMPMAIN ORG0100HMAIN: MOVA,9AH ORLA,#20H;让P05为......
  • 【C语言】文件操作
    在C语言中,文件操作是通过一组标准库函数来实现的,这些函数定义在<stdio.h>头文件中。以下是一些基本的文件操作函数及其用法:文件打开(fopen):FILE*fopen(constchar*filename,constchar*mode);filename是要打开的文件名。mode是打开文件的方式,例如"r"(只读)、"w"(只......
  • 【C语言】字符函数和字符串函数
    在C语言中,字符函数和字符串函数通常用于处理单个字符和字符串。这些函数定义在<ctype.h>(字符函数)和<string.h>(字符串函数)头文件中。以下是一些常用的字符函数和字符串函数及其用法:字符函数(ctype.h)字符函数主要用于测试字符的属性或转换字符。isalnum():检查字符是......
  • STL 以及 C语言与C++的区别
    C++语言的标准库(STL)容器(Containers)vector:动态数组,可以动态增长和收缩,支持快速随机访问元素。list:双向链表,支持在任意位置快速插入和删除元素。map:关联容器,以键值对(key-value)形式存储元素,支持快速查找和插入。竞赛常用C++STL用法https://io.zouht.com/154.htmlv......
  • C语言 - 结构体转cha*
    c语言结构体转cha*在C语言中,将结构体转换为char*通常意味着你想要获取结构体的内存表示,并将其视为字符数组。这种转换可以通过使用memcpy函数来实现。下面是一个简单的例子,展示了如何将结构体转换为char*:#include<stdio.h>#include<stdlib.h>#include<string.h>......
  • 47.C语言函数练习题整理
    题目来自练习册和牛客网的一些编程题目整理函数都有返回值且只有一个返回值声明类型为void可以返回空值若调用一个函数中没有return语句返回一个不确定的值形参是动态变量实参和形参之间的数据传递方式为实参到形参的单向值传递形参的值发生改变不会影响主调函数中的......
  • C语言:动态内存管理的学习1
    动态内存管理本章重点为什么存在动态内存分配?动态内存函数的介绍mallocfreecallocrealloc常见的动态内存错误·几个经典的笔试题·柔性数组一.为什么存在动态内存分配?我们已经学到的开辟空间的方法:inta;intarr[100];单个开辟空间或者连续开辟空间;在数组的......