C语言指针系列——并不可怕的声明

【c 语言】声明了一个指针,会给指针分配内存吗? 这篇文章到这里就结束了如果觉得这篇博客对你有用的话,别忘记三连哦。我是豌豆射手^,让我们我们下次再见。 阅读详情

指针就像双节棍,指针的指针就像三节棍,依此类对至n节棍。。。

指针的数组,呃,就像某种伤不起的棍。。。

 

C语言里面最灵活、有时候也是最让人莫名的就是指针了,以至于专门有一本书叫《C和指针》。尤其是指针的声明,指向整型的指针,指向数组的指针,指向函数的指针,再加上n多个括号的组合,有时候真让人摸不到头脑。其实,理解指针声明的关键首先在于记住*, [], ()操作符的优先级和结合性;然后由指针名称开始由内向外层层解剖,再复杂的声明也不难解释。本文使用一种自创的图示的方法,来清晰地展示指针声明的根本。

 

首先我们来看一下与指针声明相关的一些运算符的优先级:

(优先级高低由上至下,即上面的操作符的优先级高于下面的运算符的优先级。)

 

操作符描述结合性
() 函数调用 L-R
[] 下标引用 L-R 
*间接访问R-L

 

请务必记住以上运算符的优先级,下面我们来看几个例子。为了能更形象地说明指针声明,我们使用图示法。

 

 

1. 基本数据类型的指针。

让我们从最简单的开始,相信大家都能说出这个声明中var的意思。

a) int *var;

显然,var是一个指向整型的指针,图示如下:

 

 

2. “数组的指针”和“指针的数组”

经过热身,来看一下数组的指针。

a) int (*var)[6];

根据“由内向外”的原则,我们层层分析。

第一层:(*var),表示对var进行解引用,那么var肯定是一个指针。那么它指向什么呢?接着看。(下面用xxx表示(*var))。

第二层:int xxx[6],Ok,看来xxx是一个数组,就是说对var进行解引用后得到一个数组,并且数组的元素是int。

结论:到此为止,这个表达式就解释完了。var是一个指向数组的指针,指向的数组有6个元素,并且数组元素的类型是int。

 

 

有了上面的基础,相信下面的声明对你也不难了:

b) int *(*var)[6];

第一层:与上面的示例一样,var是一个指针。

第二层:int *xxx[6],xxx是什么呢?又有*操作符,又有[]操作符,应该先解释那个呢?上文提到的操作符的优先级这里要发挥作用了。[]操作符的优先级高于*操作符,所以xxx先与[]结合,那么xxx是一个数组,数组的元素类型是int *,即指向整型的指针。

结论:var是一个指向数组的指针,指向的数组有6个元素,并且数组元素的类型是int *,即指向整型的指针。

 

 

如果你感觉对数组和指针足够清晰了,来看一下下面的声明:

c) int *var[6];

这个貌似比上面的简单多了,不过不要上当哦,var这里可不一定是指针。

第一层:*和[]同时出现,还是先看操作符的优先级,[]高于*,所以var先与[]结合,因此var是个数组。

第二层:对var进行下标引用后,得到数组的一个元素xxx。int *xxx,xxx是个指向整型的指针。原来数组的元素是int *,即指向整型的指针。

结论:var是一个数组,数组有6个元素,数组元素的类型是int *。

 

 

3. 函数的指针

从某个意义上说,函数指针是指针中的精髓,提供了极大的便利性,同时也引起了足够的混乱,函数的指针要是再和数组结合起来,可真是乱上加乱。不过没关系,只要我们牢记运算符的优先级,使用由内至外的方法,一样能够清晰地解释。话不多说,来看示例。

(为了简化声明,更突出声明中的指针,如果函数没有参数,则省略了函数的参数类型,即将func(void)记为func()。在实际编程中,强烈建议你使用函数参数void,明确标示该函数没有参数)

a) int (*var)();

第一层:(*var), var是一个指针,指向什么呢?接着看。

第二层:int xxx(),xxx是一个函数,所以var指向的是一个函数。

结论:var是一个函数指针,指向一个函数,并且,函数的参数类型是void,返回值类型是int。

 

 

有了上面的例子做参考,相信这个也不难。

b) int *(*var)();

第一层:(*var), var是一个指针。

第二层:int * xxx(),xxx是一个函数,所以var指向的是一个函数。

结论:var是一个函数指针,指向一个函数,并且,函数的参数类型是void,返回值类型是int *。

 

 

不要被迷惑哦,来看这个。

c) int *var();

注意()和*操作符的优先级,()操作符高于*,优先计算。

到这里相信大家都能理解了,var只是一个函数,不是指针。

结论:var是一个函数,函数的参数为void,返回值为int *。

 

如果你认为已经对函数的指针足够了解了,那么来试试下面这个。

d) int *(*var())();

还是第一次在一个表达式中出现两个()操作符,不怕,还是两大法宝:操作符优先级,由内向外。

第一层:(*var()),()操作符优先级高于*,所以先计算var(),再对结果与*操作符做运算。所以var是一个函数!对函数的返回值可以做解引用操作,所以函数的返回值是一个指针,指向什么呢?往下看。

第二层:int *xxx(),看看上面的示例c,不陌生吧,xxx就是一个返回值为int *的函数。

结论:var是一个函数,函数的参数为void,返回值为一个函数指针,指向的函数参数为void,返回值为int *。

 

 

细心的读者会发现,函数指针和数组指针的声明非常类似,只是将[]操作符换位()操作符。的确,由于()和[]操作符的优先级都高于*,所以指向数组的指针和指向函数的指针声明都很类似。

 

不过,目前[]和()操作符还没有一起出现过,如果一起出现,会是什么情况?

e) int (*var[6])();

第一层:(*var[6]),[]优先级高于*,所以var先与[]操作符做计算,var是一个数组。接下来对数组的元素做解引用,那么数组的元素是指针。

第二层:int xxx(),很容易吧,数组的元素解引用后是一个函数,函数的返回值是int。

结论:var是一个数组,有6个元素,元素的类型是指向函数的指针,函数的参数是void,返回值是int。

 

 

其实看破指针的声明,分辨指针、数组、函数并不困难,只要你牢记本文反复强调的两点:

1) 牢记*, [], ()操作符的优先级

2) 从变量名开始,由内向外的顺序分层分析

再复杂的声明都能清晰地解释。

 

而且,变量是指针、数组还是函数,在一层中就能确定。

1) 如果变量第一层的形式是(*var),那么var一定是一个指针;

2) 如果变量第一层的形式是(...var[x]),那么var一定是一个数组;

3) 如果变量第一层的形式是(...var()),那么var一定是一个函数;

至于指针指向的是什么数据类型,数组的元素是什么数据类型,函数的参数和返回值是什么类型,则需要继续向外层看才能判断。

 

耐心读完本章的读者,恭喜你,相信你现在已经对指针的声明有了很多的了解,并且能够区别指针、数组、函数的声明。虽然指针的声明还能更复杂,甚至远远复杂,但是在实际情况中并不会出现。本章的内容相信能够涵盖实际中的95%的情况,理解本章已经足够让你在实际中使用指针了。更重要的是,如果你能理解本章提出的图示法,相信即使遇到再复杂的指针声明,你都能独立去解析。

 

当然,关于指针的讨论远远没有结束,指针的声明只是第一步,还有更多的复杂问题。比如,什么是指向数组的指针?“指向数组的指针”和“指向数组第一个元素的指针”有什么差别?请见下一章,“指针+1”。

 

【c语言问题系列教程之一】变量声明和初始化 一、基本类型 1.c语言整数类型的大小并没有精确的定义,而是随着编译器的类型而变化,ANSI C能保证的只是数据的最小尺寸。char>=8位,short>=16位,int>=16位,long>=32位。 2.因此,可以用typedef定义int16和int32,然后根据实际的机器环境把它们定义为int,short,long等类型。但是,标准头文件已经定义了标准名称int16_t,uint32_ 阅读详情

相关推荐

娓娓道来c指针 (4)解析c的声明语句

在继续探索c指针之前,有必要来解析下c语言中复杂的声明语法。 只需要记住两则:一个原则,一个规则。 原则:先看标示符。 规则:运算符优先级是规则。

CCPP Blog 4218

C++中的var类型

C++中的var类型 C++中的var类型不同于其他的常见类型,其他的类型例如int、float、char等类型需要自己知道数据的类型,再根据需要定于,而var类型可以根据你赋值的类型来确定变量的类型:例如: var a = 10,则a是整形、var b = “abc”,则b是字符型、var c = 6.66,则c是浮点型。使用var时需要注意以下事项: 1、必须在定义时初始化,如:var a...

rush aa 1万+

SAP开发实战:用FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本(附完整ABAP代码)

本文详细介绍了如何使用SAP的FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本,提供完整的ABAP代码实现方案。通过该BAPI,开发者可以高效完成财务凭证的批量修改,确保数据一致性和审计合规性,显著提升SAP财务模块的运维效率。

weixin_29224589的博客 381

Var关键字

​​var​ 关键字是 C# 中一个方便的特性,可以简化代码并提高可读性,尤其是在处理复杂类型或泛型集合时。然而,使用​var​ 时需要注意确保代码的可读性和维护性,避免在类型不明显的情况下使用​var​。​​​​​​​。

weixin_62879005的博客 737

FICO F.27 Customer statement 打印

需求,定制化打印,替换标准的F.27打印 类似于采购订单的打印,但是略有不同,查阅资料之后步骤如下: T-code F.27 is SAP standard program to produce customer/vendor correspondence (letter). Correspondence Type is used to specify the related printing program and form for the particular correspondence. SAP

IamRunjiang的博客 1965

抖音直播参数逆向实战:手把手教你用Python获取ttwid和x-bogus(附完整代码)

本文深入解析抖音直播接口的反爬机制,重点剖析核心防护参数ttwid和x-bogus的生成原理与作用。通过Python实战,手把手教你逆向获取ttwid、webid等关键参数,并构建稳定的数据采集方案,为开发者提供企业级数据获取能力。

weixin_29196891的博客 1044

c语言知识点7

C 指针 什么是指针? 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为: type *var-name; 在这里,type 是指针的基类型,它必须是一个有效的 C 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中...

阳神 2070

从频谱分析到硬件加速:用ZYNQ-7020+FFT IP核实现实时信号处理的完整方案

本文详细介绍了如何利用ZYNQ-7020和FFT IP核实现实时信号处理的完整方案,涵盖系统架构设计、硬件加速实现及性能优化。通过异构计算架构,该方案将1024点FFT处理延迟压缩至28μs,显著提升工业自动化和无线通信等领域的实时频谱分析效率。

weixin_33704234的博客 467

C语言函数

函数学习小结 1.可变参数列表 int example(int val,...) { va_list var_arg; //var_list变量用于访问参数列表未确认部分 va_start(var_arg,val); //将初始值赋值给var_arg,val取参数列表数量 for(int i=0;i<val;i++) { printf("%d\n",var_arg); va_arg(var_arg,int); //逐个访问参数列表,注意:只能按顺序访问,必须正确注明类型 } va_end(var_

qq_44143507的博客 260

华为OD新系统机试真题 - 端口流量统计

华为OD机试新系统真题【端口流量统计】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统4月26号机试真题【端口流量统计】。

qq_45776114的博客 764

【推荐100个unity插件之27】推荐5种办法实现unity人物布料系统 衣服裙子飘动 头发飘动 胸部抖动 骨骼模拟 配件摆动 尾巴摆动 —— 主要是Magica Cloth 2插件

要实现Unity中的人物布料系统并使其具备动态效果,可以探索多种技术方法。这些方法不仅可以使衣服、裙子、头发等元素自然飘动,还可以实现胸部抖动、骨骼模拟、配件摆动和尾巴摆动等细致效果。本文将深入探讨五种实现这些动态效果的技术方案,从基础的物理模拟到高级的动画控制,帮助你打造逼真的人物表现。本文主要探究Magica Cloth 2的使用,因为我想探究最好的实现方法,而不是探究最多的实现方法。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 6304

c#——var

var 是c#语言新增的一种方式,可用于变量名前,让变量通过赋值来自动匹配数据类型。 using System; namespace hello { /// <summary> /// 这是第一个控制台应用程序,实现简单输出功能 /// </summary> class Program { stat...

SaBo‘s Blog 2482

Opencv项目实战:09 物体尺寸测量

《Opencv项目实战:09 物体尺寸测量》本项目主要是运用了之前扫描文档的思想,以A4纸为背景,检测其中区域的物体长和宽。我的摄像头无法固定,所以是手持的,且由于我在寝室里面是真的没有找到合适的测量物体以及背景色(全是米色或原木色的)。所以效果有所欠缺,但经过ps修改的图片,检测的效果还是很不错的。

m0_62919535的博客 1万+

理解C语言中指针的声明以及复杂声明的语法

昨天刚把《C程序设计语言》中“指针与数组”章节读完,终于把心中的疑惑彻底解开了。现在记录下我对指针声明的理解,顺便说下如何在C语言中创建复杂声明以及读懂复杂声明。

qq_28205153的博客 1万+

基石篇:多模态数据工程导论与核心概念

多模态数据工程不是写Python脚本处理几张图片,而是设计并构建一套系统,来规模化地生产高质量、可追溯、符合合规要求的模型就绪数据。本文将为你建立正确的数据工程思维框架,明确其在多模态AI生态中的战略地位,并为后续的深入学习奠定坚实基础。

jiaquan3011的博客 629

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

指针c语言有什么作用,c语言中指针有什么用?

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

weixin_42515781的博客 9109

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C语言复杂声明解析

C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的:The right-left rule: Start readin

wangweixaut061的专栏 1万+

深度学习工具包 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")

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C语言指针的声明

下面将以变量名p对声明中用到的符号进行解释 1,当p与符号[ ]结合时(结合在p的右边),符号[ ]的作用就是声明变量p是一个数组类型.[ ]里面的数字决定了数组中元素的个数,如 int p[5]; // 声明变量p是一个整型数组,数组中有5个元素 2.当p与符号( )结合时(结合在p的右边),符号( )的作用就是声明p是一个函数通过p()可以调用该函数,( )中可以有参数列表或者无参数列表,如...

More reading and learning to become excellent 1936

c语言指针变量初始化_在C中声明,初始化和使用指针变量

c语言指针变量初始化 在C中声明,初始化和使用指针变量 (Declaring, Initializing and using a pointer variable in C) In this tutorial, we will learn how to declare, initialize and use a pointer. We will also learn what NULL poin...

cunfen6312的博客 2905

C语言中const的详细用法及声明规则

前言本文主要涵盖了以下两部分的内容: 介绍了C语言中const的详细用法. 介绍了C/C++语言下声明语句的规则.

RuuuuuunNER 1万+

C语言/指针、声明与使用

本文深入探讨了C语言中指针的概念、声明和使用。指针是内存地址的抽象表示,用于标识数据在内存中的位置。文章首先介绍了指针变量的声明方法,包括为不同数据类型声明相应的指针变量。接着,解释了间接运算符“*”的用途,即通过指针变量访问其指向地址处的值。通过示例程序,展示了如何使用指针变量存储变量地址、通过指针访问和修改变量的值,以及指针在函数中的应用,包括如何通过指针参数在函数间交换变量值。文章强调了指针在C语言编程中的重要性,并提供了内存图帮助理解指针与变量地址的关系。 示例程序1运行结果: 通过程序示

2502_91794894的博客 1291

《C语言笔记:数组和指针并不相同》

在初学C编程的时,总是会听见说“数组和指针是相同的”,这是一种非常危险的说法。今天通过对《C专家编程》的学习,重新认识下指针和数组,分析下它们之间“并不相同”的原因。

qq_40709487的博客 657

C语言函数指针声明

因为C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是 C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的

a7458969的专栏 2081

C语言:指针1:指针的声明以及复杂声明语法(一个C语言小白的理解之旅)

一. 什么是指针?如何定义指针? 指针是一个变量,其值为另一个变量的地址(内存位置的直接地址)。就像其他变量或常量一样,我们必须在使用指针存储其他变量地址之前,对其进行声明。 定义指针的一般类型为: <类型> <变量标识符>,<变量标识符>,…; 需要注意的是: 对于32位操作系统,内存地址大小是4个字节,指针变量的大小也需要4 个字节。 对于64位操作系统,内存地址大小是8个字节,指针变量的大小也需要8个字节。 二. 如何对指针变量进行声明? 1.声明简单的指针变量

qq_37453637的博客 2858

C语言声明

C语言声明

init33的博客 2681

C语言 指针声明和定义 - C语言零基础入门教程

C语言 指针声明和定义 - C语言零基础入门教程

baidu_1234567的博客 1904
下一篇: [leetcode] sudoku solver:暴力还是优化
TigerMee
博客等级 码龄19年 74粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值