C++ 基本概念(指针,数组(一维二维),结构体)

C++基本概念(指针,数组(一维二维),结构体,类和对象)

易混淆概念

 

 

  • 指针

计算机储存数据时必须跟踪的3种基本属性

  1. 信息存储在何处
  2. 存储的值是多少
  3. 存储信息的类型是什么

指针是一个变量,其存储的是值的地址,而不是值本身。

常见的变量,使用取地址符号(&)即可获得变量的地址。

而 * 被称为间接值(indirect velue)或者是解除引用运算符。将其引用于指针,即可知道该地址存储的值。

举例:

int update = 6;
int *P_update;
P_update = &update;

int变量update和指针变量P_update只不过是同一枚硬币的两面。

  • 关于指针的声明

//指针的声明,必须要指定指针所指向的数据类型
//原因很简单,char和double类型使用的字节数是不一样的
int * pr;

其中 int * 可以看做一种类型,指向int的指针。

  • C++11中,使用new来分配空间

new将找到一个长度正确的内存块,并将返回该内存块的地址。

int * pr = new int;

系统已经给指向int类型的指针pr分配了符合int长度的空间,完成初始化,程序不会报错并发生内存泄漏。

  • C++11中,使用delete释放内存

 int * pr = new int;
/****
     ****/
delete pr;

务必要记住释放内存

  • 使用new来创建动态数组,并释放空间

int * psome = new int [10];


delete [] psome;

动态数组,及为可以在程序运行中,需要数组的时候创建,不需要的时候,不创建。

可以在程序运行中选择要创建数组的长度。这就叫动态联编

使用delete的时候务必要注意。

  • 不要使用delete来释放不是new分配的内存
  • 不要使用delete释放同一个内存块两次
  • 如果使用new【】为数组分配内存,则应该使用delete【】来释放
  • 如果使用new为一个实体分配内存,则应该使用delete释放

一定要注意

  • 如何使用动态数组

牢记,指针等于数组名,不需要大括号

double * pr = new double [3];
pr[0] = 0.2;
pr[1] = 0.3;
pr[2] = 0.4;
//数组名和指针没有区别
  • 指针,数组及指针算术

数组名为数组第一个元素的地址。

double wages[3] = {1.000,2.000,3.000};
short stack[1] = {3,2,1};
double * pw =wages;//注意,数组名为数组第一个元素的地址,就是一个单纯的wages,不需要大括号
short *pr = &wages[0]; 

显然

现在模拟输出
pw存储的是地址100,pw+1,因为pw是指向double类型的指针,所以pw+1存储的地址是108.
*pw显然是1.000,*(pw+1)是2.000,务必区别*(pw+1)和*pw+1,前者是2.000,后者是3.000
运算顺序不一样。

而pr就不一样了,pr因为是指向short类型的指针,所以pr+1,地址加2
其余同理。
  • 函数与数组

数组名被视为地址,int wapes[4],指针名为wapes,就是地址,可以直接int *  ps = wapes;

//一维数组
int data[4] = {1,2,3,4};

int sum(int data[],int size);
int sum(int *p,int size);//sum(data,4)可读性一般
//二维数组
int data[3][4] = {{1,2,3,4},{3,4,5,6},{8,5,2,3}} ;

int sum(int (*arg)[4]),int size);

int sum(int data[][4],int size);//可读性比较强

二维数组

在C++中,没有提供二维数组,在C++中创建的二维数组,可以理解为:创建每个元素都是数组的数组。

比如:int maxtemps[4][5];

maxtemps包含四个元素的数组,每个元素都是一个由5个整数组成的数组。 

那么在一位数组中,我们知道,数组名(wages【4】的wages)代表第一个元素的地址

在二维数组中,具体存储数据的是maxtemps[X][Y];

而maxtemps[X][Y]的数组名是maxtemps[X],这就代表了maxtemps[X][Y]的第一个元素的地址是maxtemps[X]

 

二维数组,比如max[4][5],如果我只要第一行的元素,将max[0]的地址传出即可

int * pr =  max[0];

pr[0]:第一行第一列元素的地址,pr[1]:第一行第二列元素的地址

传参的时候也是

XXX.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QDebug>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    double pr[4][5];

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

XXX.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    pr[0][0]=0;
    double * oiu = pr[0];
    qDebug()<<"二维数组pr[0]"<<pr[0];
    qDebug()<<"double类型的指针"<<oiu;
    qDebug()<<"二维数组pr[1]"<<pr[1];
    qDebug()<<"二维数组pr[2]"<<pr[2];
    qDebug()<<"二维数组pr[3]"<<pr[4];
    qDebug()<<"二维数组pr[0][0]"<<pr[0][0];

}

MainWindow::~MainWindow()
{
    delete ui;
}

输出如下:

  • 结构体C++

可以存储大量数据,并且存储元素的类型可以不一样。

//最标准的结构体
struct inflatable//关键字struct加上结构体名称
{
   char name[20];
   float volume;
   double prices;
};//声明结束需要冒号

关于结构体的初始化

inflatable guest = 
{
  "Glorious Gloria";
  1.88;
  29.99;
};

具体访问

guest.name就是查看name的内容,其余同理

如果我们使用typedef的话

       //定义结构体
       struct Student
    {
       int a;
    };    
    //于是就定义了结构体类型Student
       //声明变量时直接Student stu2;
       //如果在c++中如果用typedef的话,又会造成区别:
    struct   Student   
    {   
       int   a;   
    }stu1;//stu1是一个变量  

       //使用时可以直接访问stu1.a

    typedef   struct   Student2   
    {   
       int   a;   
    }stu2;//stu2是一个结构体类型=struct Student  

    
    //但是stu2则必须先   stu2 s2;声明一个变量
    //然后               s2.a=10;

那么既然如此,我们来看看C里面是怎么样做的

//此处为C++代码
struct Student
{

  int age;

  char s;

};

//如果要定义一个该结构体变量,就需要:struct Student st1;
//如果是C++的话,直接Student st1;

//以下内容和C++一样
typedef struct Student
{

int age;

char s;

}Stu;

那么我们定义该结构体变量的时候,就可以使用

Stu st1;
st1.age;

综上我们可以看出,typedef的作用,就是将struct Student用Stu这种简单的形式代替而已。

二者在结构的没有typedef下的情况是不一样的,是有区别的。C++显然更加简单

  • 结构体的其他内容

 1,使用new创建动态结构

struct things
{
   int good;
   double bad;
};

thing grunose = {3,4.53};
things * pt = &grunose;
//显然,grunose.good = 3,grunose.bad = 4.53;
//显然,pt—>good = 3;pt—>bad= 4.53;

动态即意味着实在程序运行中需要设置的内容,而不是一开始静态编译好的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是基于 C 语言写的一段 vector 与 xarray 互相转换的代码,能够兼容一维二维、三维情况: ``` #include <stdio.h> #include <stdlib.h> #define MAX_DIMS 3 typedef struct { void *data; int dims[MAX_DIMS]; int ndims; } xarray; typedef struct { void *data; int size; } vector; /* 将一维数组转换为 vector 结构 */ vector array_to_vector(void *data, int size) { vector v; v.data = malloc(size * sizeof(char)); memcpy(v.data, data, size * sizeof(char)); v.size = size; return v; } /* 将 vector 结构转换为一维数组 */ void *vector_to_array(vector v) { void *data = malloc(v.size * sizeof(char)); memcpy(data, v.data, v.size * sizeof(char)); return data; } /* 将 xarray 结构转换为 vector 结构 */ vector xarray_to_vector(xarray a) { vector v; int size = 1; for (int i = 0; i < a.ndims; i++) { size *= a.dims[i]; } v = array_to_vector(a.data, size); return v; } /* 将 vector 结构转换为 xarray 结构 */ xarray vector_to_xarray(vector v, int *dims, int ndims) { xarray a; a.data = vector_to_array(v); memcpy(a.dims, dims, ndims * sizeof(int)); a.ndims = ndims; return a; } /* 将一维数组转换为 xarray 结构 */ xarray array_to_xarray(void *data, int size) { int dims[1] = { size }; return vector_to_xarray(array_to_vector(data, size), dims, 1); } /* 将二维数组转换为 xarray 结构 */ xarray array2d_to_xarray(void *data, int nrows, int ncols) { int dims[2] = { nrows, ncols }; return vector_to_xarray(array_to_vector(data, nrows * ncols), dims, 2); } /* 将三维数组转换为 xarray 结构 */ xarray array3d_to_xarray(void *data, int dim1, int dim2, int dim3) { int dims[3] = { dim1, dim2, dim3 }; return vector_to_xarray(array_to_vector(data, dim1 * dim2 * dim3), dims, 3); } int main() { /* 示例代码 */ int a[3] = { 1, 2, 3 }; xarray arr1 = array_to_xarray(a, 3); vector vec1 = xarray_to_vector(arr1); int *b = vector_to_array(vec1); for (int i = 0; i < vec1.size / sizeof(int); i++) { printf("%d ", b[i]); } printf("\n"); int c[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } }; xarray arr2 = array2d_to_xarray(c, 2, 3); vector vec2 = xarray_to_vector(arr2); int (*d)[3] = vector_to_array(vec2); for (int i = 0 ### 回答2: 要基于C语言写一段vector与xarray(可以理解为多维数组)之间互相转换的代码,兼容一维二维和三维数组结构。下面是一个可能的实现: ```c #include <stdio.h> #include <stdlib.h> // 定义xarray结构体 typedef struct { void* data; // 数据指针 size_t size; // 元素大小 size_t* shape; // 每个维度的大小 size_t dim; // 维度数量 } xarray; // 定义vector结构体 typedef struct { void* data; // 数据指针 size_t size; // 元素大小 size_t length; // 长度 } vector; // 从vector转换为xarray xarray vector_to_xarray(vector vec, size_t* shape, size_t dim) { xarray arr; arr.data = vec.data; arr.size = vec.size; arr.shape = shape; arr.dim = dim; return arr; } // 从xarray转换为vector vector xarray_to_vector(xarray arr) { vector vec; vec.data = arr.data; vec.size = arr.size; vec.length = 1; for (size_t i = 0; i < arr.dim; i++) { vec.length *= arr.shape[i]; } return vec; } int main() { int arr1D[] = {1, 2, 3, 4, 5}; int arr2D[][3] = {{1, 2, 3}, {4, 5, 6}}; int arr3D[][2][2] = { {{1, 2}, {3, 4}}, {{5, 6}, {7, 8}} }; // 一维数组转换为xarray size_t shape1D[] = {5}; xarray xarr1D = vector_to_xarray((vector){arr1D, sizeof(int), 5}, shape1D, 1); // xarray转换为一维数组 vector vec1D = xarray_to_vector(xarr1D); printf("1D array: "); for (size_t i = 0; i < vec1D.length; i++) { printf("%d ", ((int*)vec1D.data)[i]); } printf("\n"); // 二维数组转换为xarray size_t shape2D[] = {2, 3}; xarray xarr2D = vector_to_xarray((vector){arr2D, sizeof(int), 6}, shape2D, 2); // xarray转换为二维数组 vector vec2D = xarray_to_vector(xarr2D); printf("2D array:\n"); for (size_t i = 0; i < vec2D.length; i++) { printf("%d ", ((int*)vec2D.data)[i]); if ((i + 1) % shape2D[1] == 0) { printf("\n"); } } // 三维数组转换为xarray size_t shape3D[] = {2, 2, 2}; xarray xarr3D = vector_to_xarray((vector){arr3D, sizeof(int), 8}, shape3D, 3); // xarray转换为三维数组 vector vec3D = xarray_to_vector(xarr3D); printf("3D array:\n"); for (size_t i = 0; i < vec3D.length; i++) { printf("%d ", ((int*)vec3D.data)[i]); if ((i + 1) % (shape3D[1] * shape3D[2]) == 0) { printf("\n"); } else if ((i + 1) % shape3D[2] == 0) { printf(" "); } } return 0; } ``` 在代码中,我们定义了`xarray`结构体和`vector`结构体来分别表示多维数组一维数组。`xarray`结构体包含了数据指针、元素大小、每个维度的大小和维度数量等信息;`vector`结构体包含了数据指针、元素大小和长度等信息。 我们实现了`vector_to_xarray`函数,该函数将一个`vector`对象转换为一个`xarray`对象。我们还实现了`xarray_to_vector`函数,该函数将一个`xarray`对象转换为一个`vector`对象。这两个函数通过将对应的属性进行赋值实现了转换。 在`main`函数中,我们定义了一维二维和三维的数组,并进行了相应的转换测试。我们通过指定每个维度的大小和数组的元素大小来进行转换,并打印转换结果。 该代码实现了一维二维和三维数组与`xarray`和`vector`之间的互相转换,可以根据需要进行扩展。 ### 回答3: 在基于C语言编写的代码中,可以使用以下的方法来实现Vector和Xarray之间的互相转换,同时兼容一维二维和三维的情况。 首先,我们可以定义一个结构体来表示矢量或者数组,该结构体包含了维度信息以及指向数据的指针。比如: ``` typedef struct { int dim; // 维度 int* shape; // 每个维度的大小 double* data; // 数据的指针 } Xarray; ``` 使用上述结构体定义了Xarray类型,其中dim表示维度,shape是一个数组,存储每个维度的大小,data是一个指向双精度浮点型数据的指针。 接下来,我们可以定义一个函数用于将Vector类型转换为Xarray类型。假设Vector的定义如下: ``` typedef struct { int size; // 大小 double* data; // 数据的指针 } Vector; ``` 我们可以编写一个函数来实现Vector到Xarray的转换,代码如下: ``` Xarray vector_to_xarray(Vector v) { Xarray x; x.dim = 1; x.shape = (int*) malloc(sizeof(int)); x.shape[0] = v.size; x.data = v.data; return x; } ``` 该函数首先创建一个Xarray结构体,并将其维度值设为1,然后根据Vector的大小动态分配shape数组内存,并将Vector的大小赋值给shape[0],最后将Vector的数据指针赋值给Xarray的data指针。 类似地,我们也可以编写一个函数来实现Xarray到Vector的转换: ``` Vector xarray_to_vector(Xarray x) { Vector v; v.size = x.shape[0]; v.data = x.data; return v; } ``` 该函数根据Xarray的shape数组中的第一个元素来确定Vector的大小,并将Xarray的数据指针赋值给Vector的数据指针。 以上就是基于C语言编写的将Vector和Xarray互相转换的代码,并且可以兼容一维二维和三维的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值