【C指针】初识指针

【C/C++】结构体指针赋值的方法 使用"*"操作符:通过解引用结构体指针访问结构体成员并赋值。使用"->"操作符:通过结构体指针访问结构体成员并赋值。这两种方法都可以对结构体指针所指向的结构体成员进行赋值操作。 阅读详情

 

本文将引领读者初步认识指针。本人建议读者先将代码读懂,然后再自己编写代码,通过调试或直接输出的方式,查看指针的执行过程。

目录

什么是指针

指针变量

基本特性


什么是指针

在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。编译系统根据程序中定义的变量类型,分配一定长度的空间。

下面的实操中,我将尝试帮助读者理解一个变量是如何存在一块地址中的

打开VS2019,写如下代码:

  1. 在” return 0”所在行打好断点。进入调试模式(一般是点击“本地Windows调试器”);
  2. 将输出的地址复制到上图3箭头里,并回车。注意,程序每次执行的地址都是不一样的;
  3. 如果没有弹出“内存1”对话框,则在调试模式下,前往(调试-窗口-内存-内存1)开启;
  4. 在空白处右键;
  5. 在弹出的对话框中,将显示格式设置为“4字节整数”,带符号显示。因为int型是4个字节,并且存储的是一个正数10,这样更方便我们查看。
  6. 这时,我们就可以看到,上图箭头2所输出的地址中,保存的数据是“10”。

 

于是,在程序中,我们得知了地址为:“000000F7F65CF954”中存储的数据是“10”。通过地址能找到所需的变量单元,可以说,地址指向该变量单元,我们将地址形象化地称为“指针”。目前来说,指针,就是某个内存地址!

就像是你家的地址是Xxx省Xxx市Xxx区Xxx小区第x栋11楼2号,我通过这个地址就一定能找你家。那么,这个地址就是一个指针,指向的是你家。

变量的两种访问方式

我们变成一般是通过变量名来对内存单元进行,例如上图第7行,使用变量a直接取得里面的数据。其实程序经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。这种按变量地址存取变量的方式称为直接访问方式。

 

还有一种间接访问的方式,即变量中存放的是另一个变量的地址。也就是说,变量中存放的不是数据,而是数据的地址。按C语言的规定,可以在程序中定义整型变量、实型变量、字符型变量,也可以定义这样一种特殊的变量,它是存放地址的。

例如上图中,我先把变量a的地址放在一个指针中(别忘了指针就是专门用来存放地址的),然后通过取出指针中的地址,再根据地址去取出地址内的数据。

指针变量

就像是第4、5行代码中,变量a先是保存的数据为10,然后将保存的数据更换为100。指针也可以像变量一样更换保存的数据,那么这个指针就成为指针变量,它可以保存该种类型的任何地址。就像是上图中的第8、9行代码,指针p最初保存的是xa的地址,接下来就不保存xa的地址了,转而保存xb的地址。

 

指针变量的基本特性:

  1. 若有一个变量专门用来存放另一个变量的地址,那么就称它为“指针变量”。也就是说,指针变量里面存放的是指针,即地址。
  2. 一定要区分“指针”和“指针变量”这两个概念。指针是一个地址,而指针变量是存放地址的变量。
  3. 习惯上我们也将“指针变量”简称为“指针”,但大家心里一定要明白这两个指针的区别。一个是真正的指针,它的本质是地址;而另一个是指针变量的简称。
  4. 指针变量也是一种变量,占有内存空间,用来保存内存地址。指针类型的所有数据类型全部占4字节(32 bit:4字节;64bit:8字节),因为它本身是存储地址的!
    printf("int*:%d,char*:%d,double*:%d,folat*:%d",sizeof(int*), sizeof(char*),sizeof(double*), sizeof(float*));
  5. *:间接操作符
    1. 在指针声明时,* 号表示所声明的变量为指针
    2. 在指针使用时,* 号表示取出该地址中的数据。
    3. 即:*p放在等号的左边赋值(给内存赋值,写内存);*p放在等号的右边取值(从内存获取值,读内存)

 

指针变量的高级特性:

  1. 指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变量。
  2. 指针变量和它所指向的内存块是两个不同的概念。
    1. 给p赋值p=0x1111; 只会改变指针变量值,不会改变所指的内容的值。
    2. 给*p赋值*p='a'; 不会改变指针变量的值,只会改变所指的内存块的值。
  3. 当我们不断的给某一指针变量赋值,就是不断的改变该指针变量的指向,与所指向的内存空间没有任何关系。

定义指针变量及初始化

//指针的先定义后初始化
void test01()
{
	int a=100;
	int* p; //定义指针变量

	p = &a; //把a变量的地址赋值给p,p此时保存的是a的地址;

	printf("p保存的地址为%p\n", p);
	printf("*p=%d\n", *p);
}

//指针的定义就初始化
void test02()
{
	int a = 10;
	int* p = &a;

	printf("p保存的地址为%p\n", p);
	printf("*p=%d\n", *p);
}

指针变量的赋值

void test01()
{
	int x = 9;
	int* pa, *pb;

	pa = &x; //把x的地址赋值给pa
	pb = pa; //指针变量的赋值

	printf("*pa=%d,*pb=%d\n", *pa, *pb); //都是一样的值
}

可见,可以直接将一个指针变量赋给另一个指针变量,只要将指针变量名赋给另一个指针变量名即可。但是需要注意的是:

  1. 这两个指针变量的基本数据类型一定要相同。
  2. 在赋值之前,赋值运算符“=”右边的指针变量必须是已经初始化过的。也就是说,切忌将一个没有初始化的指针变量赋给另一个指针变量。这是非常严重的语法错误。

基本特性

指针的申明与初始化

void test01()
{
	int* a, b, c; //只有a才是指针变量,b、c都是int型变量
	
	//如果要想同时申明多个指针变量,需要每个变量名前都加“*”号
	int* aa, * bb, * bc;
}
void test02()
{
	int* a, * b, * c; //只有这样a、b、c才都是int型指针变量

	/*不可直接赋值为常数
	*a = 10; 报错为:使用了为初始化的局部变量a
	*b = 20;
	*c = 30;
	因为指针变量a、b、c保存的是一个内存地址,而不是
	*/
}

void test03()
{
	int* a, * b, * c; //只有这样a、b、c才都是int型指针变量
	int x = 100;

	//a = x; 错误,相当于把x的值 当做一个地址值 赋值给a,当使用*a时,通过改地址取出里面的数就会出错
	a = &x; //正确,把x的地址 赋值给a,当使用*a时,通过改地址取出里面的数
	printf("%d", *a);

	b = &x;
	c = &x;
	printf("%d %d %d", *a, *b, *c); //全部输出100

	x = 90;
	printf("%d %d %d", *a, *b, *c); //全部输出90
}

scanf初始化指针

int num = 10;
printf("%p\n", &num);
int *p;  //等价于int *p=NULL; 
scanf("%p", &p);  //以地址的形式格式化输入;例如  0062FEA8 
printf("%p,%d", p, *p); //p是格式化输出指针本身(地址),*p是输出该指针所指的内容;

指针指向的改变

double a=10.8;
double b=20.8;  //指针的类型决定了该指针应该读取多长的地址,
//char型指针向后读取一个字节,int型指针向后读取4字节,
//如果int型指针读取char型指针,则会出错为 在内存中多读取了3个字节;则会多抓到一些垃圾值;这也要求指针类型和所指类型要一致;
printf("%p,%p\n",&a,&b);//先输出a和d的地址,以十六进制的方式显示;
double *p=&a;
printf("%lf,%p\n",*p,p);
p=&b; //改变了指针p的指向;
printf("%lf,%p",*p,p);

二级指针

//定义:int ** text,相当于是:int*/*text; 就是用来保存一级指针的地址
int x = 10;
int *p;//向OS提出申请,但还没有落实到那一块内存空间; printf("p的地址:%p", p);是无法执行的;
int **pp;
int ***ppp;
printf("x的地址:%p\n", &x); //显示内存地址:%p和%x(舍掉开头的00,并且小写);

p = &x;
printf("指针p的地址:%p,p的指向的值:%d\n", p, *p);

pp = &p;//二级指针只可以用来被一级指针的地址赋值;
printf("指针pp的地址:%p,pp的指向的值:%d\n", pp, **pp);

指针的初始化

int *p;//指针没有初始化;则不能这样:printf("%x", p);
int *pa = NULL;
printf("空指针的地址:%p", pa);  //地址为00000000
//空指针决不可读取里面的内容;
//定义:是这块内存区域的首地址,然而是类型决定指针要向前读取多少个字节;
//指针存储的是首地址,类型决定在哪里结束合解析的方式;

指针运算

int num = 100;
int *p1 = #//地址的赋值
int *p2 = p1; //指针的赋值,p1,p2保存的都是num的地址;
			  //p1,p2,num,一个改变,其他两个都会改变
printf("num:%d,*p1:%d,*p2:%d\n", num, *p1, *p2);
*p2 = 3;//改变其中任何一个,就将会改变全部
printf("改变后:num:%d,*p1:%d,*p2:%d\n", num, *p1, *p2);

 

 

 

 

C语言,初识指针 指针,存在于C语言中,用途广泛。有了它就可以直接使用地址找到存储数据的空间直接修改,或者使用。那么在学习指针之前我一直有一个疑惑,那就是为什么要有指针?函数的内容可以直接通过名字直接访问,为什么还需要绕一圈?这不是更复杂了吗?事实上指针给我们提供了许多便利,接下来就来具体介绍什么是指针,以及指针的作用。 阅读详情

相关推荐

目前最新NIST随机数测试软件下载、安装、及使用教程

最近由于科研需要,在搞一些随机数的测试的事情,众所周知 随机数测试我们可以使用NIST的软件进行多大15项的随机测试,我也在网上查找了很多大牛的博客,但是都是年代久远,很多的链接现在都是物是人非,都是不能直接使用了,今天顺便抽点时间更新一下这个NIST软件的下载及使用。我们首先讲一下该软件的下载:1.我们直接取NIST的官网(https://csrc.nist.gov/)下载即可 ;链接如下:下载...

Miracle.Zhao的博客 3万+

C++结构体与其指针传参、赋值

C++结构体

qq_43487717的博客 3063

[3D检测系列-PV-RCNN] PV-RCNN实战指南:从论文解析到代码调试全流程

本文提供了PV-RCNN在3D目标检测领域的实战全流程指南。文章深入解析了其Point-Voxel融合的核心思想,并详细演示了从环境搭建、数据准备、代码复现到模型训练与调试的具体步骤,特别针对常见的报错问题给出了解决方案,帮助开发者高效掌握这一经典算法。

weixin_29189381的博客 480

leetcode算法题--盛最多水的容器

原题链接:https://leetcode-cn.com/problems/container-with-most-water/ 1、暴力(超时) int maxArea(vector<int>& height) { int n=height.size(); int ans=INT_MIN; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ ans=max(ans,min

bob的博客 454

机器人控制入门:用SAC算法让机械臂学会抓取(PyBullet仿真教程)

本文详细介绍了如何使用SAC算法在PyBullet仿真环境中训练机械臂完成抓取任务。通过强化学习中的软Actor-Critic(SAC)算法,结合熵最大化机制和双Q网络架构,有效解决了机械臂控制中的探索难题。教程包含环境搭建、算法原理、状态空间设计、奖励函数优化等核心内容,并提供了实用的训练技巧和参数调优指南。

weixin_29091105的博客 359

Rocky Linux 9 远程桌面配置全攻略:从零搭建XRDP服务(含防火墙设置)

本文提供了在Rocky Linux 9上从零开始配置XRDP远程桌面服务的完整指南。详细介绍了系统准备、XRDP服务安装、防火墙与SELinux安全设置、多用户性能优化以及多平台客户端连接实测。重点解决了使用Windows远程桌面协议(RDP)连接Rocky Linux时常见的配置难点与安全问题,帮助用户获得稳定高效的图形化远程访问体验。

vodka的博客 646

C++指针,指针的引用,指针的赋值,指针传递与指针的引用传递

指针有时候真的不是很好懂下面下面我将利用调试的方式讲解一下指针到底是个什么东西 这里我使用了链表结构题 指针传递传递 这张图片我们可以看出head指针的地址与head指针所指向的内容的地址也就是值的地址如下图: 继续Debug 显而易见p指针所在的地址与head不同 说明了什么? 说明了当指针作为函数参数传递指针其实就是值传递(也就是把head拷贝一份)如下图: ...

你好丶下一秒 1万+

汽车IVI中控开发入门及进阶(九):显示屏

显示屏Display panel和触控屏Touch panel,可以说随着汽车四化的进展,屏越来越多,越来越大,越来越高清,成为IVI中控、智能座舱系统的重要组成部分。比如如下一个电阻触摸屏。正文:显示屏主要功能就是显示,车载内容和信息的传递全靠显示屏,目前车载显示屏的种类可以分为:LCD液晶显示屏(TFT(薄膜晶体管)驱动的有源矩阵液晶显示,再细分IPS、TFT、SLCD,这几个子类)、LED显示屏(用 LED发光二极管作为背光光源)、OLED 显示屏。

码农17年的博客 2526

【C++】单个结构体 - 结构体数组 - 结构体指针之间的赋值关系 - 引用

核心观点: 单个结构体是不能写成“指针名 = 结构体变量名”; 结构体数组却可以写成“指针名 = 结构体变量名”  。   观点1论证:单个结构体是不能写成“指针名 = 结构体变量名”的, 例如 pstu = stu1 是错误的,必须写成 pstu = &amp;stu1 。 见下面的程序 #include &lt;stdio.h&gt; int main(){ struct stu...

王磊的博客 6181

2、OTA/gm - C滤波器的架构与设计

本文深入探讨了OTA/gm-C滤波器的两种主要设计方法:基于LC梯形网络的设计与多环反馈(MLF)结构。前者包括元件替代法和信号模拟法,分别通过电感替代或电路方程模拟实现低敏感度滤波器;后者通过积分器级联与反馈网络合成全极点或含任意传输零点的传递函数。文中详细分析了不同结构如IFLF和LF的反馈矩阵、传递函数及性能差异,指出LF结构在敏感度、噪声和整体性能上的优势。同时比较了各类方法的优缺点及适用场景,为高频连续时间集成电路滤波器的设计提供了系统性指导。

fanta的博客 137

手把手教你学Simulink--基于高频与高速信号处理的滤波器场景实例:毫米波雷达中匹配滤波器的多目标分辨仿真

在自动驾驶、智能交通和工业感知等领域,毫米波雷达(mmWave Radar)因其高分辨率全天候工作和抗电磁干扰能力,成为关键的感知传感器。其核心信号处理算法之一是匹配滤波器(Matched Filter),用于在强噪声背景下最大化信噪比(SNR),实现对微弱目标的检测。在调频连续波(FMCW, Frequency-Modulated Continuous Wave)雷达中,发射信号为线性调频(Chirp)信号。当信号遇到多个目标时,回波是多个延迟版本的叠加。

MHD0815的博客 134

【C语言】初识指针

【C语言】初识指针

m0_68662723的博客 2862

nvidia系列教程-AGX-Orin linux源码下载编译

NVIDIA AGX Orin 是一款高性能的嵌入式计算平台,广泛应用于人工智能、自动驾驶、机器人等领域。为 AGX Orin 编译定制的 Linux 内核,可以更好地适应特定应用需求,增强系统的灵活性。本文将详细介绍如何下载、配置和编译适用于 AGX Orin 的 Linux 内核源码。本文介绍了如何为 NVIDIA AGX Orin 平台下载、配置和编译定制的 Linux 内核源码。通过编译和部署定制内核,您可以更好地控制系统的行为,并根据特定应用需求进行优化。

flypig has a dream! 1283

C语言之初识指针

c语言中指针的初步认识.详细介绍

@初阶牛的博客 1936

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深度学习工具包 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语言】—— 指针一 : 初识指针(上)

(中央处理器)在处理数据的时候,需要的数据是从内存中读取的,处理后的数据也会放在内存中。函数来求字符串长度,代码逻辑是:传入字符串首元素的地址(指针),然后找到字符串最后一个元素的地址(指针),两个指针相减,得到的是中间的元素格式,即整个字符串的长度啦。取出变量的地址,把他放在哪呢?因此,对于数组来说,我们只要找到了他的首元素地址,那他剩下元素的地址也能顺藤摸瓜找到。好啦,本期关于指针就介绍到这里啦,希望本期博客能对你有所帮助,同时,如果有错误的地方请多多指正,让我们在C语言的学习路上一起进步!

yusjushd的博客 1363

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C语言指针初识

指针本质上是一种特殊的变量,与普通变量存储数据值不同,指针变量存储的是内存地址。可以把指针想象成是记录某个物品在仓库中位置编号(内存地址)的小纸条。比如,我们有一个整型变量num,指针变量可以存储num在内存中的地址,通过这个地址,我们就能间接访问和操作num。指针为我们提供了一种间接访问数据的方式,这在许多编程场景中都发挥着关键作用。在C语言中,定义指针变量需要指定它所指向的数据类型。数据类型 *指针变量名;int *ptr;// 定义一个指向整型数据的指针变量ptr这里的是指针声明符,它表明ptr。

jieyucx的博客 1189

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C语言——初识指针

指针(Pointer)是编程语言中一种重要的数据类型它,它用于存储变量的内存地址。换句话说,指针指向内存中的某个位置,其内容就是地址,这个地址指向存储的数据,程序可以直接访问和操作内存中的数据,这为动态内存分配、函数传参、数组访问等操作提供了便利和灵活性。总的来说,指针是一种允许直接操作内存地址和数据的数据类型,是实现诸多复杂数据结构和高级编程技术的重要基础。

ASHIDEH的博客 1864

【C指针】初识指针,轻松了解指针

指针相信就是大家在学习C语言的时候最头疼的一块,可是指针真的那么难以理解吗?相信此篇可以帮助大家理解并掌握指针!

m0_70088010的博客 665

C语言 初识指针

c语言指针

2302_81328814的博客 2055

c语言---9 初识宏、指针

define是一个预处理指令,有两种用法,一种是用define定义常量;另外一种是define定义宏。 下面的例子为利用define定义常量 运行结果为1000. 下面的例子是define定义宏 运行结果为5. 将改为,则运行结果为11.预期的运行结果为4x5=20,为什么会出现这样的结果呢?因为define定义宏是替换,就变成了4x2+3=11了,4x2为X,Y仍然是3。如何让其得到正确的结果20呢?在写宏的时候,将X与Y括起来,因为X与Y可能不是简单的数字,它可能是表达式,所以定义宏的时候应该是这样的定

qq_42822743的博客 382

C语言、初识指针

这篇文章系统讲解了C语言指针的核心概念和使用方法。主要内容包括:1)内存和地址的关系,用公寓房间比喻内存单元;2)取地址操作符(&)获取变量地址;3)指针变量的定义和使用,以及解引用操作符(*)的作用;4)指针变量的类型和大小在不同平台下的差异;5)指针运算,包括加减整数和指针相减;6)二级指针的概念和使用;7)指针的分类(指针数组、数组指针等)。通过生活化的比喻和代码示例,帮助读者理解指针这一复杂但重要的编程概念

加油,量变引起质变 2126

初识C语言·指针(1)

总结一下,const在*前面,修饰的是*pa,会导致a的值无法被改变,也即是指针变量指向的元素的值为定值,const在*后面,修饰的是pa,会导致pa存的地址无法被改变,也就是指针变量无法被修改。这里的p就是一个指针变量,因为a是整型类型的,所以p是int* ,同理,如果a是char类型的,p的类型就是char*,那按道理来说,p存了a的地址,打印出来的结果应该是一样的,来试试。是的,它也代表取地址,不然你看,我们使用scanf的时候,为什么加这个,就是为了取地址出来,然后把“外卖”送进去咯。

更新各种计算机技能~ 1370

【C语言】深入理解数组和指针——初识指针

哈喽大家好,我是保护小周ღ,C语言,接下来给大家带来的是深入理解数组和指针的初识指针,这篇主要讲的是基础指针的相关知识,是博主的所见所闻,细节上的知识后面会这里面没有提,会放在后期的文章中与数组相结合讲,多多包含~

保护小周ღ的博客 2823

C语言初识指针

初始指针笔记总结

ltzoro的博客 706
上一篇: Hello,Mybatis
下一篇: 【Java】注解入门
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值