精华内容
下载资源
问答
  • 在c语言中指针是
    千次阅读
    2021-11-27 18:08:15

    C语言中指针传参

    一、如何改变参数的值

    1、常见的错误写法:

    由于变量会随着栈的退出而销毁,所以下面的函数无法改变a的值。

    #include<stdio.h>
    void f(int b){  //参数b初始化为1
        b=3;//改变b的值为3
    }//随着函数的结束,变量b被销毁,a的值并没有发生改变
    int main(void){
        int a=1;
        f(a);//将a的值传入函数
        printf("a的值为:%d",a);
    }
    

    运行结果:

    a的值为:1
    
    2、解决办法使用指针
    #include<stdio.h>
    void f(int *ptr){//ptr的值等于变量a的地址
        *ptr=3;//对ptr间接访问,相当于变量a,这里把3赋值给变量a
    }
    int main(void){
        int a=1;
        f(&a);//将a的地址传入
        printf("a的值为:%d",a);
    }
    

    运行结果:

    a的值为:3
    

    二、与return进行比较

    1、使用return返回值:
    #include<stdio.h>
    int f(){
        int a=3;
        return a;
    }
    int main(void){
        int a=1;
        a=f();
        printf("a的值为:%d",a);
    }
    

    运行结果:

    a的值为:3
    

    可以看到:使用return也可以改变a的值,但是与指针不同的是,它只能返回一个值
    使用指针,可以同时改变多个变量的值,如下:

    2、使用指针改变多个参数的值
    #include<stdio.h>
    void f(int *ptr1,int *ptr2){
        *ptr1=3;
        *ptr2=3;
    }
    int main(void){
        int a=1;
        int b=1;
        f(&a,&b);
        printf("a的值为:%d\n",a);
        printf("b的值为:%d\n",b);
    }
    

    运行结果:

    a的值为:3
    b的值为:3
    

    三、如何改变指针的值?

    使用指针的指针
    #include<stdio.h>
    void f(int **ptr){//ptr初始化为b的地址
        *ptr=NULL;//对ptr进行间接访问,得到的是指针b,把它赋值为NULL
    }
    int main(void){
        int a=1;
        int *b=&a;
        printf("a的地址为:%d\n",&a);//打印a的地址
        printf("b的值为:%d\n",b);//此时b指向a,打印的是a的地址
        f(&b);
        printf("b的值为:%d\n",b);//此时指针b的值已经改变了,为NULL
    }
    

    运行结果:

    a的地址为:6422264
    b的值为:6422264
    b的值为:0
    
    更多相关内容
  • C语言中指针的用法C语言中指针的用法 intmain(void) {inta =10; } 指针存放地址,那么计算机是如何存放上面定义的a呢? 首先,a占4个字节,因为其是int类型,然后,int类型10的..
  • C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串较长的一个: #include #include char *strlong(char *str1, char *str2){...
  • C语言——指针

    2021-01-07 11:06:45
    而为了保存一个数据内存的地址,我们就需要指针变量。 众所周知,C语言的基本数据类型有:char、Int、float、double。所占字节分别为1个字节、4个字节、4个字节、8个字节。同样指针 这个概念也泛指 一类数据类型...
  • c语言中指针有什么用?

    千次阅读 2021-05-19 19:28:41
    一、什么是指针C语言里,变量存放内存,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储内存的某个指定数据对象的地址进行定位。这里,数据对象是指存储内存...

    81ad1f4a4f7dc9bfedd9a3de4027d411.png

    一、什么是指针

    C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。

    前面已经提到内存其实就是一组有序字节组成的数组,数组中,每个字节大大小固定,都是 8bit。对这些连续的字节从 0 开始进行编号,每个字节都有唯一的一个编号,这个编号就是内存地址。示意如下图:

    9b5ccacaa42b2838e7a18e8eab6bec8f.png

    这是一个 4GB 的内存,可以存放 2^32 个字节的数据。左侧的连续的十六进制编号就是内存地址,每个内存地址对应一个字节的内存空间。而指针变量保存的就是这个编号,也即内存地址。

    二、为什么要使用指针?

    在C语言中,指针的使用非常广泛,因为使用指针往往可以生成更高效、更紧凑的代码。总的来说,使用指针有如下好处:

    1)指针的使用使得不同区域的代码可以轻易的共享内存数据,这样可以使程序更为快速高效;

    2)C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等;

    3)C语言是传值调用,而有些操作传值调用是无法完成的,如通过被调函数修改调用函数的对象,但是这种操作可以由指针来完成,而且并不违背传值调用。

    三、如何声明一个指针

    3.1 声明并初始化一个指针

    指针其实就是一个变量,指针的声明方式与一般的变量声明方式没太大区别:int *p; // 声明一个 int 类型的指针 p

    char *p // 声明一个 char 类型的指针 p

    int *arr[10] // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针

    int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组

    int **p; // 声明一个指针 p ,该指针指向一个 int 类型的指针

    指针的声明比普通变量的声明多了一个一元运算符 “*”。运算符 “*” 是间接寻址或者间接引用运算符。当它作用于指针时,将访问指针所指向的对象。在上述的声明中: p 是一个指针,保存着一个地址,该地址指向内存中的一个变量; *p 则会访问这个地址所指向的变量。

    声明一个指针变量并不会自动分配任何内存。在对指针进行间接访问之前,指针必须进行初始化:或是使他指向现有的内存,或者给他动态分配内存,否则我们并不知道指针指向哪儿,这将是一个很严重的问题,稍后会讨论这个问题。初始化操作如下:/* 方法1:使指针指向现有的内存 */

    int x = 1;

    int *p = &x;  // 指针 p 被初始化,指向变量 x ,其中取地址符 & 用于产生操作数内存地址

    /* 方法2:动态分配内存给指针 */

    int *p;

    p = (int *)malloc(sizeof(int) * 10);    // malloc 函数用于动态分配内存

    free(p);    // free 函数用于释放一块已经分配的内存,常与 malloc 函数一起使用,要使用这两个函数需要头文件 stdlib.h

    指针的初始化实际上就是给指针一个合法的地址,让程序能够清楚地知道指针指向哪儿。

    3.2 未初始化和非法的指针

    如果一个指针没有被初始化,那么程序就不知道它指向哪里。它可能指向一个非法地址,这时,程序会报错,在 Linux 上,错误类型是 Segmentation fault(core dumped),提醒我们段违例或内存错误。它也可能指向一个合法地址,实际上,这种情况更严重,你的程序或许能正常运行,但是这个没有被初始化的指针所指向的那个位置的值将会被修改,而你并无意去修改它。用一个例子简单的演示一下:#include "stdio.h"

    int main(){

    int *p;

    *p = 1;

    printf("%d\n",*p);

    return 0;

    }

    这个程序可以编译通过,但是运行的话会报错,报错信息如下:

    69ae637b76adfdbf312e464cacac58ae.png

    要想使这个程序运行起来,需要先对指针 p 进行初始化:#include "stdio.h"

    int main(){

    int x = 1;

    int *p = &x;

    printf("%d\n",*p);

    *p = 2;

    printf("%d\n",*p);

    return 0;

    }

    这段代码的输出结果如下:

    5971caaa04db20d4fb3f1359274ceea6.png

    可以看到,对指针进行初始化后,便可以正常对指针进行赋值了。

    3.3 NULL指针

    NULL 指针是一个特殊的指针变量,表示不指向任何东西。可以通过给一个指针赋一个零值来生成一个 NULL 指针。#include "stdio.h"

    int main(){

    int *p = NULL;

    printf("p的地址为%d\n",p);

    return 0;

    }

    /***************

    * 程序输出:

    * p的地址为0

    ***************/

    可以看到指针指向内存地址0。在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是为操作系统保留的。但是,内存地址 0 有一个特别重要的意义,它表明改指针不指向一个可访问的内存位置。

    更多web开发知识,请查阅 HTML中文网 !!

    展开全文
  • C语言指向指针指针

    2020-07-15 03:39:00
    本文主要讲了C语言指向指针指针的相关问题,下面一起来学习一下
  • C语言中指针详解

    万次阅读 多人点赞 2021-11-01 14:12:21
    C语言中指针是一种数据类型,指针是存放数据的内存单元地址。 计算机系统的内存拥有大量的存储单元,每个存储单元的大小为1字节,为了便于管理,必须为每个存储单元编号,该编号就是存储单元的“地址”,每个存储...

    1. 什么是指针

    C语言中指针是一种数据类型,指针是存放数据的内存单元地址。

    计算机系统的内存拥有大量的存储单元,每个存储单元的大小为1字节,为了便于管理,必须为每个存储单元编号,该编号就是存储单元的“地址”,每个存储单元拥有一个唯一的地址。

    指针变量除了可以存放变量的地址外,还可以存放其他数据的地址,例如可以存放数组和函数的地址。

    2. 指针的定义和初始化

    格式:数据类型符 *指针变量名[=初始地址值]。

    功能:定义指向“数据类型符”的变量或数组的指针变量,同时为其赋初值。

    定义说明:

    1. “*” 表示定义的是一个指针变量,指针变量的前面必须有 “*” 号;

    2. 在定义指针变量的同时也可以定义普通变量或数组等其它变量;

    3. “数据类型符” 是指针变量所指向变量的数据类型,可以是任何基本数据类型,也可以是其他数据类型;

    4. “初始地址值” 通常是 “&变量名” “&数组元素” 或 “一维数组名”,这里的变量或数组必须是已定义的;

    5. 在定义指针变量时,可以只给部分指针变量赋初值;

    6. 指针变量的初始化,除了可以是已定义变量的地址,也可以是已初始化的同类型的指针变量,也可以是NULL(空指针);

    7. 指针变量初始化时,指针变量的“数据类型符”必须与其“初始地址值”中保存的数据的类型相同;

    8. 不能用auto类型的地址去初始化static型指针。

    3. 指针变量的使用

    1. 给指针变量赋值

    格式:指针变量=地址型表达式

    “地址型表达式”即运算结果是地址型的表达式。C语言规定,变量地址只能通过取地址运算符获得,即“&”,其运算对象是变量数组元素名,运算结果是对应变量或数组元素的地址。

    需要注意的是,虽然地址是一个整数,但是C语言中不允许把整数看成“地址常量”,所以此处的“地址型表达式”不能是整数。

    2. 使用指针变量

    格式:指针变量名

    需要使用地址时,可以直接引用指针变量名。

    3. 通过指针变量引用所指向的变量

    格式:*指针变量名

    “*指针变量名” 代表其指向的变量或数组元素,其中的“*”称为指针运算符。需要注意的是,这种引用方式要求指针变量必须已经定义且有值。

    4. 指针的基本运算

    1. 取地址运算符 &

    取地址运算符“&”的功能是取变量的地址,它是单目运算符。取地址运算符的运算对象必须是已经定义的变量或数组元素,但不能是数组名。运算结果是运算对象的地址。

    2. 指针运算符 *

    指针运算符“*”的功能是取指针变量所指向地址中的内容,与取地址运算符“&”的运算是互逆的,它是单目运算符。指针运算符的运算对象必须是地址,可以是已赋值的指针变量,也可以是变量或数组元素的地址,但不能是整数,也不能是非地址型的变量。运算结果就是地址对应的变量。

     取地址运算符和指针运算符的优先级和结合性:

    1. 取地址运算符、指针运算符和自增、自减等单目运算符的优先级相同;

    2. 所有单目运算符的结合性为从右至左。

    5. 指针的算术运算

    指针变量可以进行的算术运算包括:

    1. 指针变量 ± 整数;

    2. 指针变量++ ++指针变量;

    3. 指针变量-- --指针变量;

    4. 指针变量1- 指针变量2;

    由于指针运算符*与自增运算符++、自减运算符--的优先级相同,结合方向都是从右至左,因此需要注意以下各种形式的含义不同。

    6. 指针的关系运算

    两个类型相同的指针变量可以运用关系运算符比较大小,表示两个指针变量所指向地址位置的前后关系,即:前者为小,后者为大

    需要注意的是,如果两个指针变量不是指向同一个数组,则比较大小没有实际意义。

    7. 指针变量的引用

    1. 通过指针变量访问整型变量

    2. 指针变量作为函数参数

    普通变量作为函数的参数传递时是按值传递,实参与形参不共享内存。指针变量作为函数参数时是地址传递,共享内存,“双向传递”。

    以下是按值传递的情况:

     以下是按地址传递的情况:

    8. 指针和数组

    数组的指针是指向数组在内存的起始地址,数组元素的指针是指向数组元素在内存的起始地址。

    1. 当指针变量指向一维数组,可以采用以下两种方法:

    (1). 在数据定义语句中用赋初值的方式:*指针变量=数组名;

    (2). 在程序中用赋值的方式:指针变量=数组名;

    2. 当指针变量指向一维数组元素,可以采用以下两种方法:

    (1). 在数据定义语句中用赋初值的方式: *指针变量=&数组名[下标];

    (2). 在程序中用赋值的方式: 指针变量=&数组名[下标];

    3. 当指针变量指向一维数组,利用指针变量引用一维数组元素的方法如下:

    (1). 引用下标为0的数组元素:*(指针变量+0) *指针变量指针变量[0];

    (2). 引用下标为 i 的数组元素:*(指针变量+i) 等同于 指针变量[i] 或者 指针变量[i] 等同于 数组名[i];

    4. 当指针变量指向一维数组元素,利用指针变量引用数组元素的方法如下:

    (1). 引用下标为 i 的数组元素:*(指针变量 + 0)*指针变量;

    (2). 引用下标为 i-k 的数组元素:*(指针变量 - k);

    (3). 引用下标为 i+k 的数组元素:*(指针变量 + k);

    上面的总结文字看起来有枯燥,下面两张图看起来会更生动和形象一些。

     还有下面这张:

    9. 指针和字符串

    将指针变量指向字符串的方法如下:

    1. 在数据定义语句中用赋初值的方式:*指针变量=字符串;

    2. 在程序中用赋值的方式:指针变量=字符串;

    需要注意的是,这两种方法并不是将字符串赋予指针变量,而是将存放字符串的连续内存单元的首地址赋予指针变量。

    当指针变量指向字符串时,则可以利用指针变量处理字符串,处理方式有以下几种:

    1. 处理整个字符串

    (1). 输出整个字符串:printf("%s",指针变量);

    (2). 输入整个字符串:scanf("%s",指针变量);

    #include "stdio.h"
    int main(){
      char *string = "I love China";
      printf("%s",string);
      // I love China
      return 0;
    }
    

    2. 处理字符串中的单个字符

    (1). 输出整个字符串:printf("%c",指针变量);

    (2). 输入整个字符串:scanf("%c",指针变量);

    #include "stdio.h"
    int main(){
      char *string = "I love China";
      for(;*string!='\0';string++){
        printf("%c",*string);
        // I love China
      };
      return 0;
    }
    

    C语言中,字符串是按字符数组进行处理的,系统存储一个字符串时先分配一个起始地址,从该地址开始连续存放字符串中的字符,这一起始地址即字符串首字符的地址。所以,可以将一个字符串赋值给一个字符数组,也可以赋值给一个字符指针变量。

    常见的字符串的表现形式如下:

    1. 用字符数组表示字符串

    2. 用字符指针表示字符串

    3. 用下标存取字符串中的字符

    字符指针和字符数组的区别:

    1. 存储内容不同;

    2. 赋值方式不同;

    3. 字符指针变量在定义后应先赋值才能引用;

    4. 指针变量的值是可以改变的,字符指针变量也不例外;而数组名代表数组的首地址,是一个常量,而常量是不能改变的。

    10. 指针和函数

    指针变量既可以作为函数的形参,也可以作为函数的实参。指针变量作为函数参数,形参和实参之间的数据传递方式本质上是值传递,只是在调用函数时传递的内容是地址,这样使得形参变量和实参变量指向同一个变量。若被调函数中有对形参所指变量内存的改变,实际上是改变了实参所指变量的内容。

    数组名作为函数形参时,接收实参数组的首地址;数组名作为函数实参时,将数组的首地址传递给形参数组。

    引入指向数组的指针变量后,数组及指向数组的指针变量作为函数参数时,可有四种等价形式:

    1. 形参、实参均为数组名;

     2. 形参、实参均为指针变量;

    3. 形参为指针变量、实参为数组名;

     4. 形参为数组名、实参为指针变量

    C语言中,函数可以返回整型、实型、字符型数据,也可以返回指针类型数据,即返回一个地址。指针型函数是指函数的返回值是指针型,即这类函数的返回值必须是地址值,调用该类函数时,接收返回值的必须是指针变量、指针数组元素等能够存放地址值的对象。

    定义指针型函数的格式和有返回值的函数的定义格式基本相同,唯一的区别是在函数名前面加一个“*”,表示函数的返回值是指针型数据。

    指针型函数的调用和一般函数的调用方法完全相同,但需要注意的是只能使用指针变量或指针数组元素接收指针型函数的返回值,不能使用数组名接收指针型函数的返回值,因为函数名是地址常量,不是地址型变量,不能接收地址型变量数据。

    11. 指针数组

    指针数组是数组中的元素均为指针变量。

    格式:数据类型符 *指针数组名[数组长度]。

    功能:定义指针数组,有“长度”个数组元素。

    定义说明:

    1. 指针数组名是标识符,前面必须加“*”号;

    2. 定义指针数组的同时可以定义普通变量、数组和指针变量等;

    3. “数据类型符” 可以是任何基本数据类型,“数据类型符”不是指针数组元素中存放的数据类型,而是其所指向数据的数据类型。

    指针数组的初始化

    1. char *ps[]={"China","America","Russia",NULL};

    定义了一个用于指向字符型数据的指针数组ps,其长度为4,同时对指针数组元素赋初值,前面三个是字符型指针,最后一个是空指针。

    2. int a[3][3]={1,2,3,4,5,6,7,8,9}; int *p[3]={a[0],a[1],a[2]};

    利用二维数组元素初始化指针数组p,其长度为3,分别指向二维数组a中的三个一维数组的首地址。

    指针数组元素的赋值

    1. 将数组名赋予指针数组各元素

    char s[4][20]={“China”,”America”,”Russia”,NULL}; char *p[4]; p[0]=s[0];

    给指针数组元素p[0]赋值s[0],s[0]是字符串“China”的首地址。

    2. 将字符串直接赋予指针数组元素

    char *p[4]; p[0]=“China”;

    直接给指针数组元素p[0]赋值为字符串“China”的首地址。

    指针元素的使用

    指针数元素的使用和指针变量的使用完全相同,可以对其赋予地址值,可以利用其引用所指向的变量或数组元素,也可以参与运算。

     指针元素应用实例

    1. 指针在整形二维数组中的使用

     2. 定义三个国家的名称,将国家名称按字母顺序排序后输出。

    展开全文
  • c语言中指针的知识点

    2018-06-25 22:58:49
    c语言指针的基础知识点都这里,可以帮助你更好的了解指针。
  • c语言指针编程练习题.pdf
  • C语言-指针.pdf

    2019-11-23 10:50:10
    文章对C语言程序设计中指针的定义、使用进行详细的介绍,初学者可以快速掌握指针,能够对指针的使用有个初步的了解。
  • 本文主要讲了c语言指针变量作为函数参数传递,下面一起来学习一下
  • C语言函数指针

    千次阅读 2022-03-21 20:36:20
    在C语言中,函数本身不是变量,但可以定义指向函数的指针。这种类型的指针可以被赋值、存放数组、传递给函数以及作为函数的返回值等等。 先看一个普通的冒泡排序 #include <stdio.h> //正常的冒泡排序 ...

    C语言函数指针

    在C语言中,函数本身不是变量,但可以定义指向函数的指针。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等等。
    先看一个普通的冒泡排序

    #include <stdio.h>
    
    //正常的冒泡排序
    void BubbleSort(int *array, int len) {
        for (int i = len - 1; i >= 0; i--) {
            for (int j = 0; j < i; j++) {
                if (array[i] < array[j]) {	//此处直接使用关系运算符
                    int tmp = array[i];
                    array[i] = array[j];
                    array[j] = tmp;
                }
            }
        }
    }
    
    int main() {
        int array[] = {1, 2, 5, 3, 7, 5, 2};
        BubbleSort(array, 7);
        for (int i = 0; i < 7; ++i) {
            printf("%d\t", array[i]);
        }
    }
    

    应用函数指针

    void NewBubbleSort(int *array, int len,int (*fun)(int,int)) {
        for (int i = len - 1; i >= 0; i--) {
            for (int j = 0; j < i; j++) {
                if (0 == (*fun)(array[i],array[j])) {	//借助函数指针判断
                    int tmp = array[i];
                    array[i] = array[j];
                    array[j] = tmp;
                }
            }
        }
    }
    
    int shouldChange(int a,int b){
        if(a<b)
            return 0;
        else
            return 1;
    }
    
    int main() {
        int array[] = {1, 2, 5, 3, 7, 5, 2};
        NewBubbleSort(array, 7,&shouldChange);
        for (int i = 0; i < 7; ++i) {
            printf("%d\t", array[i]);
        }
    }
    

    函数指针的定义形式为

    returnType (*pointerName)(param list);
    

    returnType 为函数返回值类型,pointerName 为指针名称,param list 为函数参数列表。参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称,这一点和函数原型非常类似。
    注意:第一个括号不能省略,如果写作returnType *pointerName(param list);
    *就成了函数原型,它表明函数的返回值类型为returnType *。

    展开全文
  • 单片机c语言中指针的应用.pdf
  • c语言中指针的使用场合

    千次阅读 2021-05-25 07:27:27
    指针对于我们搞嵌入式开发的菜鸟来说非常的重要,因为太多的地方要用到这个可恶又可爱的东西,你真的了解他吗?我们一起看看大家共同讨论吧!1、指针的定义定义一个指针char *p,通常我们都会采取刚才的方法,这句话...
  • 本文主要讲了一下关于C语言指针的相关概念,希望对你的学习有所帮助。
  • C语言中指针的用法.pdf
  • C语言中指针的应用.pdf
  • C语言中指针问题解析.pdf
  • C语言中指针的运用.pdf
  • C语言中指针用法解析.pdf
  • c语言函数指针指针函数.pdf
  • C语言指针的基本知识

    千次阅读 多人点赞 2022-03-18 14:11:06
    C语言指针的基本知识详解
  • C语言指针详解,详细介绍C语言指针类型及使用方法。
  • c语言中指针用法PPT.ppt
  • c语言 指针

    2019-02-13 13:15:43
    学习c语言指针。ppt
  • C语言中指针研究与总结.pdf
  • 浅析C语言中指针的使用.pdf
  • 浅析C语言中指针与数组.pdf
  • C语言中指针教学方法探究.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 482,262
精华内容 192,904
关键字:

在c语言中指针是