c-【关于C语言线性表参数的问题】

问题描述

【关于C语言线性表参数的问题】

请问,*p,&p,* &p,这三个的区别是什么?

为什么我在开辟空间时,参数设置成*p,后面的插入等操作就无法实现,而换成 * &p之后,就可以实现了

解决方案

你所指的就是常见的编程错误之一,返回指向栈内存的指针。
void fun( int *p )
{
p = (int *)malloc(sizeof(int));
}
int main(void)
{
int *ps;
fun(ps);
printf("heap setn");//可以执行到此
*p = 5;//Segmentation fault 发生段错误
free(ps);
return 0;
}

fun 函数的参数在栈中,当fun函数结束的时候,fun所持有的栈内存就会消失。p也会消失。在上例中,你实际上传人的是一个指针值,就和其他类型一样
,指针也有值,只不过指针的值是一个地址而已,所以你fun(ps)的时候,只是把ps的值(一个地址)copy到p,实际上,ps和p就不在同一个
地方,当fun返回后,p消失了,你也就不知道它所申请的内存在哪里了,所以程序可以执行到printf,再往下执行,*p发生段段错误,因为你想要给
未知的内存区域赋值。
Int *p,这是声明p是指针变量,
*p 这样是要引用p所指向的内存,例如上例中*p = 4;
&p 就是取得指针本身的地址,不是指针指向的地址。

解决方案二:

 //指针
void swapint(int *a,int *b) { int t; t=*a; *a=*b; *b=t; }
//引用
void swapint(int &a,int &b) { int t; t=a; a=b; b=t; }

大致上,引用的效果等效于引用,差别就是存取时不需要加 * 前缀。

  • &p 等效于 **p,把一个新开辟的空间指针传出去,当然要用双指针。单指针是用了操作指向的数据。
    不过一般是谁创建谁销毁,不推荐下层开辟空间传到上层的做法,非常容易创建、销毁不成对而内存泄漏。所以双指针极少用。
时间: 2024-09-20 16:46:21

c-【关于C语言线性表参数的问题】的相关文章

C语言线性表的顺序表示与实现实例详解_C 语言

1.概述 通常来说顺序表是在计算机的内存中以数组的形式保存的线性表,是用一组地址连续的存储单元依次存储数据元素的线性数据结构.线性表采用顺序存储的方式存储就称之为顺序表.顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中. 将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构就是顺序结构. 采用顺序存储结构的线性表简称为" 顺序表".顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤

c语言-线性表有个数据输出有错

问题描述 线性表有个数据输出有错 status List_Insert(SqList *L,int List_Size) { int i=0,j=0; for(i=0;i { scanf("%d",&j); L->list[i] = j; ++L->length; 1 } //L->length = List_Size; 2 printf("%d",L->length); } 这是线性表中的插入操作,我想问的是那个L->leng

C++语言实现线性表之数组实例_C 语言

本文实例讲述了C++语言实现线性表之数组.分享给大家供大家参考.具体分析如下: 感觉用C++中的构造函数.析构函数等类的特点来描述一些数据结构更加易读,更加合理,便捷.但有一个问题,编译器不支持模板的分离编译,很不舒服 #include <iostream> using namespace std; template<class T> class CArray { public: CArray(const int &iMax); CArray(); ~CArray(); v

java-C语言中顺序线性表的合并

问题描述 C语言中顺序线性表的合并 结构体类型变量作为函数参数只能作为指针传递吗?为什么我写一个函数参数是结构体,下面引用时报错 typedef struct { char name[10]; char sex; long num; }ElemType;//自定义元素类型. typedef struct{ ElemType *elem;//存储空间基址. int length;//当前长度. int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位). }SqL

编程c语言-数据结构中构建线性表

问题描述 数据结构中构建线性表 为什么是取地址符,求普及 解决方案 因为你需要在函数内创建和返回这个表.而status这个返回值被用来返回状态. 用引用修饰参数,将参数当作返回值,这是一种常见的技巧. 解决方案二: 返回地址的引用,方便对返回的表作其他操作. 解决方案三: 有些编译器 没有bool 类型, 就用宏定义了 status 类型 表示 bool类型,不是取地址把? 应该是c++中的引用把? 如果取地址,下面的应该L->elem, 你看的是严蔚敏的数据结构? 解决方案四: 简单来说就是你

数据结构C语言实现之线性表

#include <stdio.h>#include <stdlib.h>typedef int elemType; /************************************************************************//* 以下是关于线性表顺序存储操作的16种算法 *//************************************************************************/struct Lis

关于数据结构(c语言版)线性表的问题

问题描述 关于数据结构(c语言版)线性表的问题 写完线性表实验代码后,有些错误 不会调试 求大神帮帮忙! ps.错误截图:图片说明 代码: #include #include #include #define LIST_INIT_SIZE 100 //线性表存储空间的初始分量 #define LISTINCREMENT 10 //线性表存储空间的分配增量 typedef struct{ ElemType* elem; //存储空间基址 int length; //当前长度 int listsiz

《数据结构与算法 C语言版》—— 2.3线性表的链式表示与实现

2.3线性表的链式表示与实现 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单.直观的公式来表示.然而,从另一方面来看,这个特点也造成了这种存储结构的弱点:在作插入或删除操作时,需移动大量元素.本节我们将讨论线性表的另一种表示方法--链式存储结构,其特点是用一组地址任意的存储单元存储线性表中的数据元素.由于它不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构所具有的弱点,但同时也失去了顺序表随机存取的特点

线性表 长整数运算-C++语言,利用线性表实现100位长整数的加减乘运算

问题描述 C++语言,利用线性表实现100位长整数的加减乘运算 要求输入和输出是每4位一组,加法和减法用不同的程序实现,并且要考虑输入数据的符号,且要用线性表建立数