深度剖析C/C++中数组名与指针的详细区别

C++引用深度剖析 C++引用的前生今世:引用深度剖析 阅读详情

一、数组名的运算与指针并不是完全相同。

这是最明显的例子,指针支持自增、自减运算,但是数组名并不支持自增、自减运算。其实这么做的原因也很简单,由于数组是一片连续的空间,需要一个类似于指针的东西指向这一片连续空间的首地址。由于在整个内存中对于某个个数组只有唯一的数组名,假如可以对数组名进行自增、自减运算,那么当我们下一次使用这个数组名时并不知道这个数组名是否是指向的该片连续内存的首地址,这时就会导致内存管理的混乱。因此严禁对数组名进行自增、自减操作。

二、把数组名当作参数传递给函数时数组名会退化成真正的指针。

考虑下面代码及其输出:

/* 
 * 输出: 
 * arr: 40
 * ptr: 8
 * ptr2: 8
 * int*: 8
 * func: 8
 */

#include <iostream>
 
using namespace std;

void func(int arrCpy[]) {
    printf("func: %lu\n",sizeof(arrCpy));
}

int main() {
    int arr[10];
    int (*ptr)[10] = &arr;
    int *ptr2 = arr;
    printf("arr: %lu\n",sizeof(arr));
    printf("ptr: %lu\n",sizeof(ptr));
    printf("ptr2: %lu\n",sizeof(ptr2));
    printf("int*: %lu\n",sizeof(int*));
    func(arr);
    return 0;
}

我们来逐行分析:

1、对于sizeof(arr),如果arr真的是一个指针,那么sizeof的输出应该是指针长度8(我的电脑是mac,长度由sizeof(int*)得出),而并不是整个数组的长度40。

2、对于ptr和ptr2来说,ptr是一个指针数组,ptr2是一个普通的int指针。对于&arr这个语句,编译器会自动将它转换为&arr[0]来获取 第一个元素的首地址。如果在并未对ptr和ptr2进行操作之前进行打印,你会发现数组指针的值竟然就是首个元素的地址!貌似ptr与ptr2没有任何区别啊???

//输出:
//ptr address: efbff5a0
//ptr2 address: efbff5a0   
    
printf("ptr address: %x\n",ptr+1);
printf("ptr2 address: %x\n",ptr2+1);

但是如果分别对ptr和ptr2加1之后再输出地址这个问题的答案就出来了~

//输出:
//ptr address: efbff5c8
//ptr2 address: efbff5a4   
    
printf("ptr address: %x\n",ptr+1);
printf("ptr2 address: %x\n",ptr2+1);

读者可以自己算一下这两个16进制换成十进制相差多少。这里我算出来了,两者正好相差36!而整个数组的长度正好是40且一个单元的长度为4。所以我们得出结论:数组指针指向的是整个数组,在对数组指针进行+1操作后该指针会直接指向数组整个连续的内存看空间的下一个地址(也就是ptr越过了arr这个数组的所有的10个内存单元)。而ptr2就是一个普通的整形数组,+1只会指向下一个内存单元(arr[1])。

3、第三个例子是重中之重!函数里的sizeof(arrCpy)为什么输出的是指针长度不是数组长度???我明明是传入的数组啊!这是就是因为把数组名当作参数传递给函数时数组名会退化成真正的指针!所以这牵扯出来了一个与memeset函数有关的问题:

//输出:
//-1 -1 0 0 0 0 0 0 -272632344 32766
void init(int* arrCpy) {
    memset(arrCpy, -1, sizeof(arrCpy));
    for(int i = 0; i< 10;++i) {
        cout << arrCpy[i] << endl;
    }
}

为啥只用前两个元素初始化成功了??原因很简单,当数组名退化为指针后,长度与一个int型指针长度一致,为8个字节。而一个int正好是4个字节且该数组存储的元素全部为int型。因此4*2=8只有前两个元素被=初始化了。

一般来说,并不建议传参进行memset初始化,因为如果是新手的话这些问题根本发现不了会产生迷之的错误。如果非要在函数中使用memset初始化数组,那么memset的最后一项一定要写为sizeof(type)*num的形式:

//输出:
//-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
void init(int* arrCpy) {
    memset(arrCpy, -1, sizeof(int)*10);
    for(int i = 0; i< 10;++i) {
        cout << arrCpy[i] << endl;
    }
}

只有这样才能成功的对数组进行初始化。

 

C和C++中数组名与指针的区别.pdf 对C/C++中数组名与指针从多角度进行比较分析,通过具体实例充分论证了二者的不同. 立即下载

相关推荐

C/C++数组名与指针区别深层探索

1.    引言   指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:“数组名就是指针”。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着“数组名就是指针”的误解。   想必这种误解的根源在于国内某的C程序设计教程。如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,笔者就不甚欣慰了。借此文,笔者站在无数对知识如饥似渴的中国程序员之中,深深寄希望于国内的计算机图书编写者

C/C++ 知识点:指针与数组名区别

从输出结果可以看出来,sizeof()的结果是4,说明此时的数组名是一个普通指针。

个人技术博客 348

R以及Rstudio超详细安装教程(包括安装过程中出现的问题)

R安装及Rstudio安装,以及安装中出现的问题

2301_76908257的博客 1万+

C++中数组和指针的关系(区别)详解

C++中数组和指针的关系(区别)详解 本文转自:http://c.biancheng.net/view/1472.html 博主在阅读后将文中几个知识点提出来放在前面: 没有方括号和下标的数组名称实际上代表数组的起始地址,这意味着数组名称实际上就是一个指针。 在数学语句中使用指针时,它不像常规变量那样工作。 向指针添加值时并要解引用时,括号非常重要。 array[index] 相当于 *(array + index)。 C++ 不会对数组执行边界检查。 不仅指针符号可以与数组名称一起使用,而且下标符号也可

weixin_44966641的博客 2788

医学成像学习笔记(一):核磁共振成像(MRI)k空间为何是图像频谱详解

前言   k空间是核磁共振成像图像重建的核心,可能很多人像笔者一样第一次学时会非常疑惑,为何k空间是图像的频域空间,观其填充过程,明明是空域信号的采样填充呀。网上很少有文章讨论这个问题,所以笔者在此写下自己的理解,供大家参考。 MRI位置编码   现在的MRI一次扫描的是一个断层或者多个断层,所谓断层就是一个有厚度的面,通过z方向梯度场来选择。我们扫描一个断层的目的是为了获得该断层各位置的质子情况,它们携带着组织的性质信息,反应出来的就是信号强度。如果整个断层都采用相同的磁场强度,而我们只能得到一个断

意疏的学习笔记 1万+

被Cloudflare 5秒盾虐了半个月,终用Python破局:UA+TLS指纹伪装实战,拦截率从42%干到3%

其实5秒盾不难破,难的是摸透它的检测逻辑——它不是“一刀切”地拦截爬虫,而是通过“多维度指纹校验”,判断你是不是“真实用户”。表层:UA和HTTP头要完整、匹配;中层:TLS指纹要和真实浏览器一致(核心);深层:行为要符合人类习惯(请求间隔、JS执行)。这套方案不仅适用于Cloudflare 5秒盾,很多基于指纹检测的反爬系统(如Akamai、Imperva)也适用。2025年的爬虫,早已不是“能爬就行”,而是“爬得稳、不被封”——指纹伪装就是实现这一点的关键。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1849

c++指针和数组名的区别

1.数组名是指向数组首个元素地址的指针,不可改变其指向的位置,即数组名只可指向数组的首个元素。 而指针可以改变指向第几个元素,如 int*a=new double [10]; int b[10]={1}; a[0]=0; a[1]=1; a[2]=2; a[3]=3; a=a+2;//指针可以这样操作 b=b+2;//此处报错,数组名不可改变 其指向的地址 2.每当用到数组名这个指针的时候,系统都会传入数组的信息,而普通的指针只是一个4字节的整数 cout<<sizeof(a)<<

qq_39042392的博客 302

【无人机路径规划】基于强化学习实现多无人机路径规划附matlab代码

1 简介 本文提出一种基于强化学习实现多无人机路径规划。​ 2 部分代码 % This is used to measure the path length, service rate and risk explosure for each UAVs %% parameters function [PL,ServiceRate,Risk]=measure global N2; % divide [0,1]*[0,1] map into N2*N2 grid when calcul

qq_59747472的博客 6905

6. C++数组名与指针区别

1. C++数组名与指针区别 对比 数组名 指针 &(取地址) 数组名取地址得到的是数组名所指元素地址(数组首地址) 对指针取地址得到的是指针变量自身的地址 常量变量 数组名师常量指针 指针是变量指针 sizeof 对数组名使用sizeof时,得到的是元素个数乘元素类型的字节数 对指针sizeof得到的是指针类型的字节数 1.1数组名是常量指针 数组名是常量指针,不可以被修改,指针是变量指针,可以修改 #include <iostream> using nam

qq_35123107的博客 997

[密码学实战]商密TLCP协议抓包解析与深度分析(二十九)

[密码学实战]商密TLCP协议抓包解析与深度分析(二十九)

曼岛_的博客 632

SAP SLT REODPS_REPL API 的使用介绍

本文聚焦 SAP 数据复制生态中的 RODPS_REPL(常被误写为 REODPS_REPL),解析其作为 ODP(Operational Data Provisioning)标准接口的核心功能与应用场景。RODPS_REPL 是 SAP 提供的 ABAP 接口集合,支持从 ODP 上下文(如 ODP_SAPI、ODP_CDS)执行初始化装载和增量捕获,被 SAP BW、Datasphere 及第三方工具(如 Azure Data Factory、Qlik Replicate)广泛调用。 关键要点: 核心对

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 227

C/C++数组名与指针区别

C/C++数组名与指针区别 1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组; 2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量; 3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址! 4)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,

我的读书笔记(2011-2013) 640

AI agents在公司财务报表分析中的应用

在当今竞争激烈的商业环境中,公司财务报表分析对于企业的决策制定、风险评估、战略规划等方面起着至关重要的作用。传统的财务报表分析方法往往依赖于人工操作,存在效率低下、容易出错、难以处理海量数据等问题。而AI agents作为人工智能领域的重要成果,具有自动化、智能化、高效性等特点,能够为财务报表分析带来新的突破和变革。

SuperAGI2025 1609

深度剖析指针的进阶——C语言的进阶篇

大家好我是沐曦希💕 文章目录💫前言2.字符指针练习3.指针数组数组指针数组指针的定义&数组名VS数组名数组指针的使用数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参4.写在最后 💫前言 指针的概念: 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。 指针的运算。 指针又分为字符指针,整型指针,函数指针,数组指针等。 ch.

m0_68931081的博客 1032

ATE FT ChangeKit学习总结-20250630

半导体封装测试中的ChangeKit是Handler测试机的关键配套治具,主要用于适配不同芯片封装尺寸的FT测试。其主要特点包括:1)适应性,可快速切换不同测试设置;2)精准性,确保器件测试安全;3)高效性,减少停机时间。主要组件含Shuttle传送机构、HotPlate预热盘、DockPlate连接件和Contactor压头。设计需考虑Handler型号、芯片规格及PCB匹配(如140mm标准孔位),特别在低温测试时需注意吹气块布局。ChangeKit实现了测试设备的灵活配置,提升了半导体测试效率。

歌颂苦难的行为是无耻的; 1753

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C进阶——深度剖析指针

本文深度解剖C中指针的重难点内容 让你的指针不再是问题

theonly_Love的博客 278

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C++数组名内涵深度剖析

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。 数组名的正常使用 首先我要跟大家

tangliguantou的专栏 1025

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

深度剖析指针(下)——“C”

是你们心心念念的指针噢

weixin_74957752的博客 1875

深度剖析指针(上)——“C”

是你们心心念念的指针呀

weixin_74957752的博客 1467

【C语言】深度剖析指针(二):指针与数组,字符,函数的深度关联

本文围绕数组与指针的关联展开,解析了数组名的一般含义与特殊情况,以及如何用指针访问数组。阐述了一维和二维数组传参本质,介绍了冒泡排序实现。还讲解了二级指针、指针数组、字符指针、数组指针、函数指针及函数指针数组的定义、初始化、使用及相关应用,如指针数组模拟二维数组、函数指针数组实现转移表简化多分支逻辑等。

记录了从0学习Java技术栈的日常 1874

【C语言】深度剖析指针(三):回调机制、通用排序与数组指针逻辑

本文围绕C语言中的回调函数、qsort函数、sizeof与strlen的区别及数组与指针笔试题展开。介绍了回调函数的定义、应用及优势;详解qsort函数的参数、用法、模拟实现;对比sizeof与strlen的特性;通过多个代码示例解析数组与指针相关笔试题,助读者掌握这些关键知识点。

记录了从0学习Java技术栈的日常 1083

【C语言深度剖析】详解strlen与sizeof的区别及用法

文章目录含义示例一示例二说明代码三代码四总结 关于 strlen 与 sizeof 的区别,我相信很多人都有所了解 以下我深度解析一下strlen 与 sizeof的区别和注意事项 含义 sizeof()是运算符,在头文件的类型为unsigned int,其运算值在编译时就计算好了,参数可以是指针、数组、类型、对象和函数等; strlen()是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化为指针了。该函数完成的功能是从代表该字符串的第一个地址开始遍历的

Edison's 小宇宙 1442

指针进阶深度剖析

深度剖析和指针进阶

weixin_55079859的博客 200

《C语言深度解剖》(10):数组指针、指针数组和数组指针数组

数组指针是什么?指针数组是什么?指针跟数组有什么关系?指针数组是指针还是数组?数组的类型你真的理解吗?二维数组和一维数组的关系;数组传参和指针传参。

更新C/C++,数据结构与算法,计算机视觉,深度学习,目标检测 1296

详解C语言指针(上):(含大厂面试实战哦!)指针运算、指针和数组、多级函数

🔥🍉⭐️。

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1157

深入解析C/C++多级指针:从内存模型到动态二维数组实战

指针是C/C++编程中直接操作内存的核心机制,它通过存储变量地址实现了高效的数据共享与传递。其原理在于利用内存地址的间接访问,解引用操作符(*)用于获取或修改目标数据。这一技术价值在于避免了不必要的数据拷贝,显著提升了程序性能,尤其在系统编程和底层优化中至关重要。应用场景广泛,包括动态内存管理、函数间参数传递以及复杂数据结构(如链表、树)的实现。本文聚焦于多级指针这一高级主题,通过剖析**动态创建二维数组**和**在函数中修改指针本身**等典型应用,结合内存模型图解与常见错误排查,帮助开发者掌握其正确用法与

weixin_34082789的博客 378
上一篇: 《OSTEP》读书笔记 虚拟化(3)调度算法
下一篇: servletConfig与servletContext
donCoder
博客等级 码龄9年 65粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值