精华内容
下载资源
问答
  • 二级指针传参(函数形参是二级指针)
    2021-11-23 21:19:20
    • 函数形参是二级指针,可以传入的参数——二级指针变量本身/一级指针变量的地址
    #include<iostream>
    using namespace std;
    void test1(int **ptr) {
    	cout << **ptr << endl;
    }
    void test2(char **p) {
    
    }
    int main() {
    	int n = 10;
    	int *p = &n;
    	int **pp = &p;  //二级指针
    	int* arr[10];  //指针数组,数组元素是指针
    	test1(pp);  //正确
    	test1(&p);  //正确
    	test1(arr);  //正确 因为数组名是首元素地址,那也就是指针地址,
    	//——————————————————————————————————————————————————————————————————————//
    	char c = 'w';
    	char* pc = &c;
    	char** ppc = &pc;
    	char* arr1[10];
    	test2(ppc);  //正确
    	test2(&pc);  //正确
    	test2(arr1);  //正确
    	system("pause");
    	return 0;
    }

    更多相关内容
  • c语言实现“引用传参”以及二级指针的简单应用 首先要声明c语言是没有引用传参的哈,引用传参是c++的语法。但是如果我们也想实现一样的效果该怎么写呢?(函数内的值变化可以直接对原参数的值进行更改) 其实原理都...

    c语言实现“引用传参”以及二级指针的简单应用

    • 首先要声明c语言是没有引用传参的哈,引用传参是c++的语法。但是如果我们也想实现一样的效果该怎么写呢?(函数内的值变化可以直接对原参数的值进行更改)

    • 其实原理都是一样的,我们细想c++的引用传参,其实就是把参数的地址作为参数传进了函数体内。函数体内的操作都是基于该地址上的参数进行变化的,而不是将参数的值进行拷贝传进函数体内。

    • 同样,c语言也可以实现上述效果。我们怎么做呢?也是传地址,传地址,再对该地址上的值进行变化即可。代码如下:

    • void add(int *s){ // 这个*s是其实要的是一个地址,因为指针本身就是地址
          int a=199;
          *s=a; // 这里的*s是在将s这个地址上的值进行变化
      }
      int main(){
          int s=1; //实参s
          printf("变化前地址:%d\n",&s);
          printf("变化前:%d\n",s);
          add(&s);
          printf("变化后地址:%d\n",&s);
          printf("变化后:%d\n",s);
          
          return 0;
      }
      
    • 结果如下:

    • 变化前地址:6422044
      变化前:1
      变化后地址:6422044
      变化后:199
      
    • 当然,我们s也可以定义成指针,同样也是传地址,现在要传的是指针的地址,并且一定记得要给指针分配内存,要不然会有段错误(Segmentation fault)!!!!代码如下:

    • void add(int *s){ // 这个*s是是一个指针
          int a=321;
          *s=a; // 这里就是这一步就是把a的值给指针s
      }
      int main(){
          int *q; //实参p
          q=(int *)malloc(sizeof(int));
          printf("变化前地址:%d\n",&q);
          printf("变化前:%d\n",*q);
          add(q);
          printf("变化后地址:%d\n",&q);
          printf("变化后:%d\n",*q);
          
          return 0;
      }
      
    • 结果如下:

    • 变化前地址:6422040
      变化前:-1163005939
      变化后地址:6422040
      变化后:321
      
    • 这里我们也可以练一下二级指针,加深一下理解,代码如下:

    • int a=321;
      void add(int **s){ // 这个**s是其实是一个二级指针
          *s=&a; // 这里就是将a的地址让*s存起来,传递的是址
      }
      int main(){
          int **p; //实参p
          p=(int *)malloc(sizeof(int));
          int x=123;
          *p=&x; // 这里要定义一个x,让*p存x的址,否则会段错误
          printf("变化前地址:%d\n",&p);
          printf("变化前:%d\n",**p);
          add(p);
          printf("变化后地址:%d\n",&p);
          printf("变化后:%d\n",**p);
          return 0;
      }
      
    • 结果如下:

    • 变化前地址:6422040
      变化前:123
      变化后地址:6422040
      变化后:321
      
    • 可能你会好奇,为啥这里要用二级指针?为啥a要定义成全局变量?

    • 用二级指针是因为我们要在函数体内对指针进行变化,且函数运行结束后,对指针的更改仍然有效。

    • 这里为什么不是和刚才一样定义成局部变量是因为涉及到c的内存分配,我们这里是传址。局部变量是开辟在栈内存中的,局部变量的址和值在函数体内有效,出了函数体就销毁了,也就是看起来为啥用了二级指针还是改不了?因为是局部的。所以我们改成全局的,放在堆内存中,这样就实现了我们对指针进行变化的想法。

    • 段错误处理:

      • 出现段错误时,首先应该想到段错误的定义,从
        它出发考虑引发错误的原因。
      • 在使用指针时,定乂了指针后记得初始化指针,
        在使用的时候记得判断是否为NULL。
      • 在使用数组时,注意数组是否被初始化,数组下
        标是否越界,数组元素是否存在等。
      • 在访问变量时,注意变量所占地址空间是否已经
        被程序释放掉。
      • 在处理变量时,注意变量的格式控制是否合理
    展开全文
  • 被整型数组的sizeof误导,我二级指针的空间分配一直出现问题,今天(和今天的明天)终于解决了!还有如何将字符串数组的传参问题!我!墙!啊! 概念 指针用来指向地址,例如int *p = &num;表示用 int型的p...

    文章首发及后续更新:http://mwhls.top/619.html
    新的更新内容请到mwhls.top查看。
    如果没有图片请到上方的文章首发页面查看。

    被整型数组的sizeof误导,我二级指针的空间分配一直出现问题,今天(和今天的明天)终于解决了!

    还有如何将字符串数组的传参问题!

    我!

    墙!

    啊!

    概念

    指针用来指向地址,例如int *p = &num;表示用 int型的p指针 存放 num的地址。

    而二级指针,int *q = &p;表示用 q 存放 p 的地址。
    注意这里的&p,如果写成p,那么只是q依然只是一级指针,将指向num的地址。
    此时的等价关系:

    p == &num;
    *p == num;
    q == &p;
    *q == p;
    
    *q == p == &num;
    **q == *p == num;

    函数传参

    想要将一个二维字符串数组传入函数,那么在定义时,需用格式:char *strs[] = {"str1", "str2"};

    中括号[]内不用写大小,就如同一维数组一样。

    对于一个传入二级指针的函数char *putFirstChar(char **charArray);在传参时,直接使用变量名作为实参即可,即putFirstChar(strs);

    这样,在函数内部调用时,就可以使用strs[0][0];形式了。

    我试过使用char **strs1, strs2[3][3], strs3[3][];,三种都不行。

    长度获取

    一维整型数组int intArray[10] = {1, 2};,可以使用
    int arraySize = sizeof(intArray)/sizeof(int);来获取,此时的
    sizeof(intArray)/sizeof(int) == 10;,而不等于2.

    但一维字符串数组char charArray[10] = "12";,需要用
    strlen(charArray)来获取,此时长度为2,而不等于10。

    int i = strlen(charArray);函数的效果和
    for(int i=0; charArray[i]!='\0'; i++);相同(在for内定义变量可能出错,出错请在for外定义i变量)。

    一级字符串指针的空间分配

    对于char *charArray;的空间分配,使用
    charArray = (char*)malloc(sizeof(char)*arrayLength);,其中的arrayLength为整型变量,表示char空间的个数。

    重新分配时,使用
    charArray = (char*)realloc(charArray, (strlen(charArray)+1+addLength) * sizeof(char));
    函数,表示给charArray变量增加addLength长度的空间。

    这里的长度用strlen(charArray)+1,因为字符串的结束符 '\0'也占据空间,这里的长度不能用sizeof()来获取,它无法获取char类型数组的大小。

    二级字符串指针的空间分配

    这里的内存空间分配好可恶,好可恶好可恶!
    我有的题分配了空间,一直栈溢出,气死了,我都把倍数调到一百了明明!
    但是今天做题突然就正常分配了,好气哇!

    使用到这个分配的在后面第三篇,看这里LeetCode-17-电话号码组合(C)

    按下面的格式进行内存分配即可,分配完后,char2DArray指针可以当做二维数组来用,即使用char2DArray[0][0]这种方式进行赋值。

    char **char2DArray;
    int sizeIn1, sizeIn2, i;
    char2DArray = (char**)malloc(sizeof(char*) * sizeIn1);
    for(i=0;  i<sizeIn2;  i++){
      *(char2DArray + i) = (char*)malloc(sizeof(char) * sizeIn2);
    }

    此外,这种分配方式是通用的,int型也可以,只要将代码内的char全部替换成int就行了。

    展开全文
  • c语言指针的指针传参

    千次阅读 2019-08-14 16:56:06
    #include<stdio.h> InitMemory(char **s) //InitMemory(char s) { s = (char)malloc(sizeof(char)*128);... //定义了一个字符型指针,指向垃圾值 InitMemory(&str); //InitMemory(str); InitMem...

    #include<stdio.h>
    InitMemory(char **s)
    //InitMemory(char s)
    {
    s = (char
    )malloc(sizeof(char)*128);
    }
    int main()
    {
    char *str ; //定义了一个字符型指针,指向垃圾值
    InitMemory(&str);
    //InitMemory(str);
    InitMemory(str);
    strcpy(str,“helloworld”);
    printf("%s\n",str);
    free(str);
    return 0;
    }
    注释写法会出现段错误
    首先str为指向垃圾值的指针,传参str后,形参s指针也是指向和str所指相同的一个垃圾值,利用malloc函数给s指针在栈空间申请内存后,形参s会在调用结束后在堆空间释放,实参str的值仍旧没有改变,依然是一个垃圾值,所以回到主函数利用strcpy,给str赋值,会出现段错误,如果传参传的是&str,那么形参也为一个二级指针,此时s表示的是指针str的地址,在调用函数中再给s申请空间,才能使str真正指向一段申请的内存空间,回到主函数,形参释放,str指向了一段申请的内存空间,此时用strcpy赋值才是合法的。

    展开全文
  • C语言指针传参

    2022-01-28 13:59:15
    级指针传参: 一级指针传参,可以使用数组名,代表的是数组元素首地址,如test(arr); 可以使用指针int*p=arr;test(p);也可以使用test(&arr) test为调用的函数或自定义的函数,本质传出的是“数组元素首地址...
  • 二级指针是存储了一级指针的地址,如果仅仅传递一级指针只会获得一级指针的拷贝,而不会对...但如果,传参二级指针的情况下,函数类型就可以是void型 换句话说,指针的使用就相当于让函数不仅仅只有一个返回值。 ...
  • 指针初体验(C语言指针初体验)中我们简单了解了指针的知识和使用: 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型,指针的类型...
  • C语言指针维数组传参

    千次阅读 2022-03-21 13:51:45
    维数组与指针的关系与易错1 维数组传参的三种方式:2 位数组传参所理解的歧义:总结 前言 什么是指针指针是地址的另外一种表达形式,那为什么要叫做指针呢?我的理解是这样:当我们已经有了地址的时候,...
  • 指针C语言的精华,也是很重要的章节。我在学习的时候遇到多级指针的时候也会犯迷糊,最后我稍微发现了一点方法。下面想分享给大家。这篇文章我们通过分析题目、完成多级指针传参 来讲一下多级指针传参与多级指针...
  • 一维数组传参 -- 指针数组传参 -- 二维数组传参 -- 一级指针传参 -- 二级指针传参
  • 二级指针 void GetMemory(char** p,intnum) {  *p = (char*)malloc(num*sizeof(char));  returnp; } int main() {  char*str= NULL;  GetMemory(&str,10);  strcpy(str,”hello”);  fr
  • 二维数组作为实参,二级指针作为形参 part1 报错:说我给二级指针传了一个数组指针去,数组指针(指向数组的指针), part2 给二级指针传一个数组指针就可以解决了。 part3(总结) 把指针数组和数组指针好好区别...
  • [C语言]维数组传参的格式(详细+总结)

    万次阅读 多人点赞 2018-11-30 10:57:38
    初遇维数组作函数参数,宛如自己化身为了大头儿子。很头大。 不禁大声呐喊:该怎么声明定义,该怎么调用,又该怎么函数中操作元素和地址? 在此,我要拨开这些问题的一些迷雾。 我相信,有心人看完后,再遇就...
  • C语言二级指针问题

    2021-06-10 19:47:36
    typedef struct Node{ char data; struct Node* lchild,*rchild; }BiNode,*BiTree; 本文以二叉链表的建立为背景,讨论二级指针作为参数传递的过程。
  • 在编写程序,使用数组和指针的过程中,我们总是要将数组和指针传参给函数,那么函数的参数有什么设计规范呢? 一维数组传参 #include <stdio.h> void test(int arr[]) {} void test(int arr[10]) {} void test...
  • C语言结构体传参

    2022-03-28 18:05:45
    指针传参2.1 修改结构体数据2.1.1 测试代码2.1.2 测试结果2.1.3 结果分析2.2 修改结构体地址2.2.1 测试代码2.2.2 测试结果2.2.3 结果分析3. 双指针传参3.1 测试代码3.2 测试结果3.2 结果分析 C语言结构体传参 ...
  • C语言高级编程:二级指针的赋值

    千次阅读 2018-09-02 11:51:16
    c语言中,经常会对二级指针变量(即指针的指针)进行赋值操作。如果要对一个二级指针进行赋值,不能采用 p = &(&i) 这种语句,即不能对一个变量进行两次取地址操作。因为 &i 的值是一个右值,而&...
  • 2、数组名2.1、数组名地址 数组地址三、二级指针1、什么是二级指针2、二级指针的运算 两层解引用四、指针数组1、指针数组指针还是数组-数组2、地址解引用结构体一、结构体的声明1、结构的基础知识2、结构的声明3、...
  • 详解C语言二级指针

    2021-07-02 12:28:52
    关于C语言二级指针 众所周知,指针实际上是一个数,类比int类型,在处理指针的一些操作时我们就会遇到一些问题。比如下面这个知名的程序: #include<stdlib.h> #include<stdio.h> void change(int a) {...
  • //三级指针的使用#define _CRT_SECURE_NO_WARNINGS#include #include #include //三级指针做输出int getmun(char ***pout/*out*/,int *num){int ERRO_MSG = ;if (pout==NULL){ERRO_MSG = ;printf("危险操作内存pout=...
  • 每个元素都是指针,每个指针存放的是整型变量的地址 3. 数组指针:是一个指针,里面存放的是数组的地址 int(*p)[10] //p是一个指针,存放的是数组的地址,这个数组有10个元素,每个元素都是整型 4. 函数指针
  • Q:什么时候需要二级指针? A:二级指针作为函数参数的作用:在main函数里(函数外部)定义一个指针p,在函数内给指针p赋值,函数结束后对指针p生效,那么我们就需要二级指针。 看看下面一段代码:有两个变量a,b,...
  • 二级指针及函数传参和形参问题 问题描述 在帮助解决小伙伴的问题中,发现对二级指针的理解更上一层,其问题为自建链表的初始化失败,简单描述如下 typedef struct LNode { int data; struct LNode* next; }LNode, ...
  • 一、一级指针指针就是地址。指针变量:代表地址的变量。数组C 语言中所有的数组都可以看成是一维数组,数组传参的时候会发生降维问题,任何数组传参都会降维成指针。指针指向元素;int a = 10;int* P = &a;这...
  • 文章目录前言代码:版本1分析原因执行`char *pData = 0;...今天同事问了一个问题:在函数参数中传递指针指针,很常用的一个场景,重新梳理一下记录于此,以后如果有类似的问题直接发这篇小总结就可以了。
  • //一级指针传参,用一级指针接受-----19行 //void print(int *pro, int sz)//用形参*pro接收*p并解引用 ,int型对应arr的指针p //{ // int i = 0; // for (i = 0; i < sz; i++) // { // printf("%d ",*(pro + i...
  • 在对动态数组调用传参时,我传递给的是一级指针相当于该动态数组的首元素地址,编译通过,但是在实际运行时,报错Program received signal SIGSEGV, Segmentation fault.查了很久没有查到问题,最后查到应该经vec...
  • 一维数组的传参/一级指针传参/普通指针 在理解指针的基础上,一维数组的指针传递很简单,我们知道数组的数组名就是这个数组首元素的地址,所以将数组名传入函数就可以了 // 一维数组的传递0.cpp # include <...
  • 我们知道C语言中字符串有两种保存方式:数组保存和指针保存,这两种方式从本质上来说有着很大的区别。 如图所示:数组保存时,在栈上开辟空间,字符串可以被访问修改;指针保存时,字符串保存在常量区,只可被访问,...
  • 先来看一个最常用函数模型,函数func()参数为一个uint8_t 的指针类型,那这个函数有什么作用?uint8_t data1[3];void func(uint8_t *p){p[0]=0x01;p[2]=0x02;}void main(){uint8_t *p1=data1;func(data1);}在main...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,716
精华内容 1,886
关键字:

c语言二级指针传参