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

C语言:指针

时间:2023-06-18 16:23:37浏览次数:41  
标签:变量 int void st C语言 include 指针

1、指针简单介绍

#include<stdio.h>
int main(void){
    int * p; // p是变量的名字, int * 表示p变量存放的是int类型的地址(指针变量)
    /*
        int * p 应该理解为 p 是变量名,p变量数据类型是 int * 类型,实际即使存放的是int变量地址的类型
     指针就是一个操作受限的非负整数 (只能相减,只能是两个指针变量指向的是同一块连续空间的不同存储单元才可以相减) */ int i = 3; int j = 0; /* 1、p 保存了i的地址,因此 p指向了 2、p 不是 i,i 也不是 p, 修改 p 的值不会修改 i 的值 3、如果一个指针变量指向某个普通变量,则 *指针变量 就等同于 普通变量 *p 等同于 i (在所有出现 *p 可以换成 i 在所有出现 i 的地方都可以换成 *p) */ p = &i; j = *p; printf("i = %d,j = %d",i,j);//i = 3,j = 3 }

2、指针的重要性

  • 表示一些的复杂的数据结构

  • 快速的传递数据

  • 使函数返回一个以上的值

  • 能直接访问硬件

  • 能够方便的处理字符串

  • 理解面向对象语言中引用的基础

  • 减少内存消耗

  • 执行速度快

  • 无论是什么指针变量,永远只占4个字节(只存储所指向变量的首地址)

NULL本质也是零,但不是数字零,而是表示内存单元的编号0
计算机规定,以零为编号的存储单元的内容不可读,不可写,一般用做中断异常程序的首地址

3、指针的分类

3.1 基本类型指针

    int * p; // p是变量的名字, int * 表示p变量存放的是int类型的地址(指针变量)    int i = 3;
    int j = 0; 
    p = &i; 
    j = *p;
    printf("i = %d,j = %d",i,j);//i = 3,j = 3
#include<stdio.h>
int main(void){
    int * p; 
    int i = 5;
    int * q;
    /*
        此时 p 中存储一个垃圾值,程序无法读取 *p的内容
        因为 *p所代表的内存单元的控制权限没有分配怕给本程序 
    */
    *p = i; //error
    p = &i;
    *q = p;//error 语法错误 等同于 int变量 = 指针变量
     
    printf("%d",*p);//i = 3,j = 3
} 

3.2 指针和数组

指针和一维数组

  一维数组名是一个指针常量(不能赋予其他值)。

  它存放的是一维数组第一个元素的地址。

下标和指针的关系

  如果p是个指针变量,则

  p[i] 永远等价于 *(p + i)

确定一个一维数组需要两个参数

  •   第一个元素地址
  •   数组的长度

3.3 动态分配内存

#include<stdio.h>
#include<malloc.h>
int main(void){
    int i = 5;  // 分配了4个字节 静态分配
    // malloc 是 memory 内存 和 allocate 分配 的缩写 
    /*
        1. 要使用malloc函数 ,需加  malloc.h 头文件
        2. malloc 函数只有一个形参,并且形参是个整形
        3。 4表示请求系统为本程序分配 4 个字节
        4. malloc 函数只能返回第一个字节的地址
        5. p 本身占 4 个字节,p所指向的内存也占 4 个字节 
        6. p本身所占的内存是静态分配的,p所指向的内存是动态分配的 
    */
    int * p = (int *)malloc(4); 
    
    free(p);//表示把当前p所指向的内存给释放掉 
} 

3.4 多级指针

int i = 10;
int * p = &i;
int ** q = &p;
int *** r = &q; 

 

#include<stdio.h>
#include<malloc.h>


void f(int ** q){ // q是个指针变量,无论 q 是什么类型的指针变量,都只占4个字节
int i = 5; // 静态变量
// *q 等价于 p,q 和 **q都不等价于p
*q = &i;
}

 

int main(void){
int * p;

f(&p);
printf("%d\n",*p); // error 本语句语法无问题,但逻辑上有问题。
/*
*p 保存的是 i 的值,但 i 在函数返回后就被系统回收,此时强行访问系统未分配的内存地址
*/
return 0;
}
#include<stdio.h>
#include<malloc.h>


void f(int ** q){ 

    *q = (int*)malloc(sizeof(int)); // 动态分配内存
    
    // q = 5; //error
    // *q = 5; //p = 5 error
    **q = 5; //*p = 5
}

 

int main(void){
    int * p;
    
    f(&p);
    printf("%d\n",*p);
    free(p);
    return 0;
}

4、结构体

#include<stdio.h>
#include<malloc.h>


struct Student{
    int age;
    float score;
    char sex;
};

int main(){
    struct Student st = {80,66.6,'p'}; // 初始化 定义的同时赋值 
    struct Student * pst = &st; // &st不能改成 st
    // 取成员变量
    // 1.结构体变量.成员名
    st.age = 10;
    // 2.指针变量名->成员名 
    pst->sex = 'g'; // 等价于 (*pst).sex 等价于 st.sex 
    return 0;
}
#include<stdio.h>
#include<string.h>

struct Student{
    int age;
    float score;
    char name[100];
};

// 通过函数向结构体变量赋值 ,必须发送 st 的地址 
void inputStruct(struct Student * pstu){
    (*pstu).age = 20;
    (*pstu).score = 44.5;
    strcpy((*pstu).name,"张三");
} 

// 对结构体变量输出,可以发送地址,也可以直接发送值。
// 发送地址会有不安全的隐患,但占用内存小,速度快 
// 因此在Java 中class 或者 c++中的const 等其他语言中使用对应关键字解决 
 void outputStruct(struct Student *pst){
    printf("%d,%.2f,%s",pst->age,pst->score,pst->name);
} 
int main(){
    struct Student st = {80,66.6,'p'}; // 初始化 定义的同时赋值 
    inputStruct(&st);
    outputStruct(&st);
    return 0;
}

标签:变量,int,void,st,C语言,include,指针
From: https://www.cnblogs.com/xpp3/p/17485812.html

相关文章

  • VSCode输出"Hello, World!"(编写C语言) 脑残版本一看就懂
    第一步,官网下载VSCode1.官网下载好我全部勾选了2.下载这些扩展第一个,第四个是必需的第二步,MinGW-w64官网下载gcc的资源1.下载64位的2.下载好之后解压到设置的特定文件中3.配置环境变量,点击Path添加这行环境,路径是你下载配置环境的路径配置完毕,一路点击确定3.测......
  • 前端学习C语言 - 数组和字节序
    数组本篇主要介绍:一维二维数组、字符数组、数组名和初始化注意点以及字节序。一维数组初始化有以下几种方式对数组初始化://定义一个有5个元素的数组,未初始化inta[5];//定义一个有5个元素的数组,将第一个初始化0,后面几个元素默认初始化为0inta[5]={0};//定义一个有5个元......
  • 归并排序算法及C语言实现
    一、归并排序的原理归并排序(MergeSort)是一种基于分治思想的高效排序算法。其核心思想是将待排序的数组分为两个相等的部分,对这两个部分分别进行递归排序,最后将两个有序的子数组合并成一个有序的整体。可见归并排序的时间复杂度为O(nlog2n)。下面我们来详细地介绍一下归并排序的过......
  • C语言基础教程(动态内存分配)
    (文章目录)前言本篇文章来讲解C语言中的动态内存分配,在C语言中动态内存分配经常使用,合理的使用动态内存分配可以帮助我们节省代码空间,当然了不合理的使用可能导致程序的崩溃,或者是内存的泄漏。一、动态内存分配常用函数在C语言中,动态内存分配是一种在程序运行时分配和释放内......
  • C语言基础教程(宏的使用和多文件编程)
    (文章目录)前言这篇文章来给大家讲解一下C语言中的多文件编程,在C语言开发项目的过程中使用多文件编程是必不可少的,使用多文件编程可以方便我们代码的管理和编写,让我们的代码可读性和移植性更高。一、宏的定义和使用在C语言中,宏(Macro)是一种预处理指令,用于在编译阶段进行文本......
  • C语言的几种缺陷及其规避方法
    一、C语言的几种缺陷C语言作为一种老牌编程语言,在其诞生时代的背景下是十分先进的,为编程领域的发展做出了重要贡献。但是,随着计算机体系结构、软硬件环境的不断演进,C语言所存在的一些缺点也逐渐凸显出来。以下是C语言的一些缺陷:容易出现指针错误:C语言中广泛使用指针,而指针访问出错......
  • C++面试八股文:聊一聊指针?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:面试官:聊一聊指针?二师兄:好的。面试官:你觉得指针本质上是什么?二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从0x00000000到0x3fffffff,每一个字节都对应一个地址。当我们声明一个变量并初始化它......
  • C++面试八股文:聊一聊指针?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:面试官:聊一聊指针?二师兄:好的。面试官:你觉得指针本质上是什么?二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从0x00000000到0x3fffffff,每一个字节都对应一个地址。当我们声明一个变量并初始化......
  • C语言-数据存储详解
     C语言类型内置类型整型家族char//字符数据类型1个字节unsignedcharsignedcharshort//短整型4个字节unsignedshort[int]signedshort[int]int//整型4个字节 unsignedint  signedint long//长整型8个字节unsignedlong[int] signedlong[int]longlong//更长......
  • C语言基础教学(文件操作)
    (文章目录)前言这篇文章我们来讲解C语言中的文件操作,文件操作在C语言中算是一个比较重要的知识点,我们每天都在和文件打交道,各种文件夹的打开和关闭操作,那么这篇文件带大家学习如何使用C语言中的文件操作来完成这个工作。一、文件操作基本介绍C语言提供了一组函数,可以用于进行......