首页 > 其他分享 >C语言 --- 指针

C语言 --- 指针

时间:2024-08-08 09:23:28浏览次数:6  
标签:char const int ++ C语言 --- dest 指针

目录

1.  概念

2. 指针变量初始化

2.1 被调修改主调 

2.2 指针变量的引用

3. 指针 + 一维整型数组

3.1 指针的运算

4. 指针 + 一维字符型数组

4.1 指针 +字符串



1.  概念

指针就是地址  ---  内存单元的编号

指针也是一种数据类型 --- 这种数据类型专门用来处理地址这种数据

语法:

基类型 * 指针变量名

(1)基类型:就是结构体类型,表示该指针所指向的内存空间存放什么类型的数据

(2)*  :表示此时定义的是一个 指针类型 的变量

(3)指针变量名:符合标识符命名规则

2. 指针变量初始化

如果指针变量没有初始化,此时是随机值。---- 野指针

初始化可以让指针变量有明确指向。

赋值:

int a = 10;
int *p;
p = &a;    // p指向a,因为p中保存了a的地址

int *p = NULL;   // NULL 0号地址---空指针


int *p,q;  // p是指针类型,q是int型

int *p,*q  // 此时表示定义了两个int*类型的变量p,q

2.1 被调修改主调 

(1)指针作为函数参数

形参  ---  指针类型变量,用来接收实参

实参  ---  要修改谁就把谁的地址传过去 要保证空间有效

注:被调函数中必须要有 *p 运算

(2)值传递和地址传递

值传递 --- 只是实参数据赋值了形参

地址(指针)传递 --- 传的是地址 -- 可以实现被调修改主调

eg:实现两个数求和,通过参数带出来

#include<stdio.h>

void  ADD(int a,int b,int *sum)
{
    *sum = a+b;
}

int main(void)
{
    int x=10;
    int y=2;
    int sum;
    ADD(x,y,&sum);
    printf("%d\n",sum);
    return 0;
}

2.2 指针变量的引用

*p   --- 表示访问p所指向的基类型的内存空间

(1)间接访问

(2)通过a访问 --- 直接访问

step1: 首先拿出p中地址,到内存中定位 
step2: 偏移出sizeof(基类型)大小的一块空间 
step3: 将偏移出的这块空间,当做一个基类型变量来看 

3. 指针 + 一维整型数组

数组名就是数组首元素的地址。

数组名是个常量,不能做自增自减运算。

int *p = a;            //p 指向了数组a。
a <=> &a[0]

void printArray(int *a,int len)   // 数组作为函数参数,实参传数组名

3.1 指针的运算

p+1   加n  表示跳过n个基类型

p-1 

p++

p--

不能运算p+q

p - q 表示差了多少个元素(基类型)必须是同一类型的指针

*(p+i)<=> a[ i ] <=>*(a+i)

4. 指针 + 一维字符型数组

char s[] = "hello";
char *p = s;        

void Puts(char *s)        // 指针型一维字符数组做函数参数

const 只读,就近原则,离谁近就修饰谁。

const int a; --- 此时a是一个只读的变量

const int *p = &a;    -----  const限定是 基类型 ,表示不能通过 *p 的方式 修改基类型数据 
                     
int const *p = &a;     ----   const限定是 基类型 ,表示不能通过 *p 的方式 修改基类型数据 

int * const p = &a;     ---- const限定是 指针变量p 表示将p限定位只读 ,p不能被修改 
                    
const int * const p = &a;   ---- 基类型和指针变量 都被限定为只读
p = &b; 不能修改 
*p = b;  //不能修改 

应用:
    (1)如果 不想 通过*p方式改变基类型对应的数据 
                      const int *p = &a;  
                      int const *p = &a;  
  (2)如果 指针变量p 定义好后,不想再指向别的变量 
                        int * const p = &a;

注意:

(1)形参设计为 const char * ,目的是为了防止操作函数中误操作

(2)可以提前发现问题。

4.1 指针 +字符串

字符串 --- 在c语言中是按照字符数组的形式存储 ---  字符串常量 --- 存储在字符串常量区 
const char *p = "hello"; 表示 p指向了 字符串常量区中的 "hello",因为 是指向了字符串常量区 ,只能做读取操作,不能修改

下面给出了指针处理字符串实现:gets,puts,strlen,strcpy,strcmp的代码
 

#include<stdio.h>

// 输出函数
int Puts(const char *s)
{
    if(s == NULL)
    {
        return -1;
    }
    while(*s != '\0')
    {
        putchar(*s++);
    }
    putchar('\n');
    return 0;
}

// 输入函数
char *Gets(char *s)
{
    char *ret = s;
    while((*s = getchar())!='\n')
    {
        s++;
    }
    *s ='\0';
    return ret;
}

// strlen实现函数
size_t Strlen(const char *s)
{
    long int cnt = 0;
    while(*s != '\0')
    {
        ++s;
        ++cnt;
    }

    return cnt;
}

// strcpy函数实现
char *Strcpy(char *dest,const char *src)
{
    char *ret = dest;

    while(*src != '\0')
    {
        *dest++ = *src++;
    }
    *dest = '\0';
    return ret;
}

char *Strncpy(char *dest,const char *src,size_t n)
{
    char *ret = dest;
    while( n && *src != '\0')
    {
        *dest++ = *src++;
        --n;
    }
    while(n)
    {
       *dest = '\0'; 
       --n;
    }
    return ret;
}

char *Strcat(char *dest,const char *src)
{
    char *ret = dest;

    while(*dest != '\0')
    {
        dest++;
    }
    while(*src != '\0')
    {
        *dest++ = *src++;
    }
    *dest = '\0';

    return ret;
}


char *Strncat(char *dest,const char *src,size_t n)
{
    char *ret = dest;

    while(*dest != '\0')
    {
        dest++;
    }
    while(n && *src != '\0')
    {
        *dest++ = *src++;
        --n;
    }
    *dest = '\0';

    return ret;
}


int Strcmp(const char *s1,const char *s2)
{
    while(*s1==*s2 && *s1!='\0' && *s2!='\0')
    {
        ++s1;
        ++s2;
    }
    return *s1 - *s2;
}


int Strncmp(const char *s1,const char *s2,size_t n)
{
    while(n>1 && *s1==*s2 && *s1!='\0' && *s2!='\0')
    {
        ++s1;
        ++s2;
        --n;
    }
    return *s1 - *s2;
}

void *  --- 不是空指针,而是空类型的指针,也是万能指针,可以接收任意类型的指针

注意:如果用 空类型指针 进行 间接运算 必须 转换成 有明确类型的指针 
        
 

标签:char,const,int,++,C语言,---,dest,指针
From: https://blog.csdn.net/qq_70030717/article/details/140937995

相关文章

  • 《最新出炉》系列小成篇-Python+Playwright自动化测试-66 - 等待元素至指定状态(出现
    1.简介在我们日常工作中进行UI自动化测试时,保证测试的稳定性至关重要。其中一个关键方面是正确地定位和操作网页中的元素。在网页中,元素可能处于不同的状态,有些可能在页面加载完成之前不在DOM中,需要某些操作后才会出现,而其他元素可能一直存在于DOM中,但最初处于隐藏状态,需要通过操......
  • lg-dp1
    记忆化搜索:记忆化压缩DP状态(一些期望dp里会用)剪枝递推:保证前面的部分已经计算了数位dp求\([l,r]\)之内满足某种限制的数的个数,该限制应该是与数位有关系的。带不带前导0取决于是否对统计答案造成影响。前缀和转化:只有上界补充题:如果lim=1的时候前面都......
  • 【题解】Solution Set - NOIP2024集训Day2 线段树
    【题解】SolutionSet-NOIP2024集训Day2线段树https://www.becoder.com.cn/contest/5431「CF1149C」TreeGenerator™结论:对于括号序列的一个子段,删去所有的匹配括号之后,剩下的不匹配的括号,按顺序构成树上的一条路径。Why?从括号序列的构造出发。每次(相当于开始遍历......
  • Java--异常
    目录概念Java异常类结构图Exception异常分类运行异常(RuntimeException)非运行时异常(受检查异常类)异常处理机制throw、throws关键字Throwable类中的常用方法异常处理的基本语法try、catch、finally三个语句块应注意的问题概念异常就是程序在编译时发生的意想不到的情况,一般而言......
  • 嵌入式实时操作系统(RT-Thread、FreeRTOS、UCOSIII)
    实时操作系统(RT-Thread、FreeRTOS、UCOSIII)文章目录`实时操作系统(RT-Thread、FreeRTOS、UCOSIII)``专有名词概念``1、什么是嵌入式``嵌入式系统的特点``2、什么是实时``3、什么是操作系统``操作系统主要功能和特性``常见的操作系统类型包括``4、嵌入式实时操作系统``关......
  • C语言菜鸟入门·数据结构·链表超详细解析
     目录1. 单链表1.1 什么是单链表1.1.1  不带头节点的单链表1.1.2 带头结点的单链表1.2 单链表的插入1.2.1 按位序插入(1)带头结点(2)不带头结点1.2.2 指定结点的后插操作1.2.3 指定结点的前插操作1.3 单链表的删除1.3.1 按位序删除1.3.2 指......
  • Open3D 三维重建-Delaunay Triangulation (德劳内三角剖分)
    目录一、概述1.1原理1.2实现步骤1.3应用二、代码实现2.1关键函数2.2完整代码三、实现效果3.1原始点云3.2重建后点云Open3D点云算法汇总及实战案例汇总的目录地址:Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客一、概述        德劳内三角剖......
  • Open3D 三维重建-Alpha Shapes (α-形状)
    目录一、概述1.1原理1.2实现步骤二、代码实现2.1关键函数2.1.1函数2.1.2参数详解2.2完整代码三、实现效果3.1原始点云3.2处理后点云Open3D点云算法汇总及实战案例汇总的目录地址:Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客一、概述      ......
  • C++-练习-11
      题目:编写一个程序,要求用户输入全球当前的人口和美国当前的人口(或其他国家的人口)。将这些信息存储在longlong变量中,并让程序显示美国(或其他国家)的人口占全球人口的百分比。源代码:#include<iostream>intmain(){ usingnamespacestd; longlongglobal_population......
  • 基于nodejs+vue教育企业网站[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,教育领域正经历着前所未有的变革。传统教育模式逐渐向线上线下融合的方向转型,教育企业作为这一变革的重要推动者,亟需构建高效、便......