c语言数组指针用法举例,C语言数组指针
40篇已经学完C语言3354(第八章)【指针数组和指针对指针】_ blog _c语言指针对数组的写法
Yyds干货库存
数组int a[10];int a[10];//a表示数组第一个元素的地址。
1步长4
1步长40;表示整个数组的地址;指针也是一种数据类型,它的步长取决于它所指向的内存空间的类型。所以内存空间加1就是地址偏移量40。
# define _ CRT _ SECURE _ NO _ WARNINGS # include stdlib . h # include string . h # include stdio . h void main(void){ int a[10];//a代表数组第一个元素的地址,A代表整个数组的地址,a 1 4 a 1。步长40。//{//定义一个数组类型typedef int(my type array)[10];//mytype array myArray;myArray[0]=10;myArray[1]=11;printf(%d \n ,myArray[0]);printf(%d \n ,myArray[1]);} {//定义一个指针数组类型typedef int(* PTypeArray)[10];//int * p PTypeArray myp array;//sizeof(int)* 10 myPArray=//int b=10;//int * p=NULL;//p=(* my parray)[0]=20;printf(a[0]: %d \n ,a[0]);} {//定义一个指向数组类型的指针数组类的指针int(* my pointer)[10];//变量告诉C编译器给我分配内存my pointer=(* my pointer)[0]=40;printf(a[0]: %d \n ,a[0]);} printf(你好.\ n’);系统(“暂停”);返回;}1.你为什么需要一个指针?指针解决了编程中的一些基本问题。
首先,指针的使用使得不同区域的代码很容易共享内存数据。当然,你也可以通过复制数据来达到同样的效果,但是这样往往效率很低,因为结构之类的大数据会占用大量的字节,复制会消耗大量的性能。但是,使用指针可以避免这个问题,因为任何类型的指针占用的字节数都是相同的(4字节或8字节或其他可能,具体取决于平台)。
其次,指针使得构造一些复杂的链接数据结构成为可能,如链表、链式二叉树等。
第三,有些操作必须使用指针。比如操作申请的堆内存。还有:在C语言的所有函数调用中,值传递都是“按值传递”。如果我们想修改函数中传递的对象,必须通过这个对象的指针来完成。
2.指针是什么?指针是程序数据在内存中的地址,指针变量是用来存储这些地址的变量。
因为内存中的每个字节都有一个唯一的编号,所以程序中用到的变量、常数、偶数函数等数据在加载到内存中时都有自己唯一的编号,这个编号就是这些数据的地址。指针就是这样形成的。
char ch= aint num=97我们可以大致画出记忆模型中变量ch和num的存储。(假设char占1字节,int占4字节)
3.指针和变量的关系用来保存指针的变量是指针变量。如果指针变量p1持有变量num的地址,就说p1指向变量num,也可以说p1指向num所在的内存块。这种指向关系通常由图中的箭头表示。
int main(void){ int num=97;int * p1=numchar * p2=(char *)(num);printf(%d\n ,* P1);//输出97 put char(* p2);//输出一个返回0;}指针值:很好理解。例如,上面的num变量的值是0028FF40,因此p1的值是0028FF40。的数据地址用于在内存中定位和标识该数据,因为在内存中不重叠的任何两个不同数据的地址都是不同的。
指针的类型:指针的类型决定了指针所指向的内存字节数以及如何解释这些字节。通常,指针变量的类型应该与它所指向的数据类型相匹配。
因为num的地址是0028FF40,所以p1和p2的值是0028FF40。
*p1:会从地址0028FF40开始解析,因为p1是int类型指针,int占用4个字节,所以连续向后取4个字节,把这4个字节的二进制数据解析成整数97。
*p2:将从地址0028FF40开始解析,因为p2是char类型的指针,char占用1个字节,所以连续向后取1个字节,将这1个字节的二进制数据解析成一个字符,即 a 。
同样的地址,因为指针的类型不同,对它所指向的内存的解释也不同,得到的数据也不同。
4、指针类型5、数组指针和指针数组“数组指针”和“指针数组”,只要在名词中间加上“的”字,就知道中心是3354。
数组的指针:这是一个指针。什么样的指针?指向数组的指针。
指针数组:这是一个数组。什么样的阵?带有指针的数组。
那么,需要明确一个* *优先顺序:()[] * * *,所以:
(*p)[n]:根据优先级,先看括号,然后p是指针。这个指针指向一个长度为n的一维数组,也就是“指向数组的指针”,也就是数组指针;
*p[n]:按照优先级,先看[]然后P是数组,再组合。这个数组的元素是指针类型,总共有n个元素。这就是“指针数组”,即指针数组。
根据以上两个分析可以看出,p是什么,短语的中心词就是什么,即数组“指针”和指针“数组”。
int * P1[5];//指针数组int(* p2)[5];//指向数组的指针。首先,对于语句int p1[5],因为“[]”的优先级比“[]”高,所以p1先和“[]”组合起来,形成一个数组的定义。数组命名为p1,“int”修改数组的内容,即数组的每个元素。也就是说,该数组包含五个指向int类型数据的指针,如图1所示,因此它是一个指针数组。
其次,对于语句int (p2)[5],()”的优先级高于“[]”。“*”号和p2构成指针的定义,指针变量命名为p2,而int修改数组的内容,即数组的每个元素。也就是说,p2是一个指针,指向包含五种int类型数据的数组,如图2所示。很明显,它是一个数组指针。该数组在这里没有名称。这是一个匿名数组。
这样,对于指针数组来说,首先,它是一个数组,数组的所有元素都是指针,也就是说数组存储指针,数组占用多少字节由数组本身决定;对于数组指针来说,首先它是一个指针,它指向一个数组,也就是说它是一个数组的指针,在32位系统中它会一直占用4个字节。至于它指向的数组是多少字节,这个无法确定,要看具体情况。
5.1,数组指针(* p)[n]# include STD afx . h int main(){//一维数组int a[5]={1,2,3,4,5 };//步长为5的数组指针,即数组中有5个元素int(* p)[5];//将数组A的地址赋给P,那么P就是数组A的地址,那么*p表示数组A本身p=//%p输出地址,而%d输出十进制//\ n Enter//在C中,几乎所有使用数组的表达式中,数组名的值都是指针常量,即数组第一个元素的地址,其类型取决于数组元素的类型。printf(%p\n ,a);//输出数组名。一般用数组第一个元素的地址来标识一个数组,然后输出数组第一个元素的地址printf(%p\n ,p);//根据上面的,p是数组A的地址,输出数组A的地址printf( % p \ n ,* p);//*p表示数组A本身,一般一个数组printf(%p\n ,a[0])由数组第一个元素的地址标识;//a[0]( % p \ n ,a [1])的address printf//a[1]( % p \ n ,p [0])的address printf//数组第一个元素的地址printf(%d\n ,* * p);//*p是数组A本身的第一个元素的地址,那么*(*p)就是值。当*p是数组第一个元素的地址时,**p表示第一个元素的值1 printf(%d\n ,* p[0]);//根据优先级,p[0]代表第一个元素的地址,那么*p[0]代表第一个元素本身,也就是第一个元素的值1 printf(%d\n ,* p[1]);//是一个绝对值很大的负数,不代表a[1].我还不知道这是什么意思。//将一个二维数组赋给指针int b[3][4];int(* PP)[4];//定义一个数组指针,指向有4个元素的一维数组PP=b;//将二维数组的第一个地址赋给pp,即b[0]或b[0]。二维数组中pp=b和pp=b[0]是等价的PP;//pp=pp 1,这条语句执行后,pp的指向从b[0][]行变为b[1][],PP=b[1]int k;scanf_s(%d ,返回0。}根据上面的二维数组,数组指针也被称为指向一维数组的指针,所以数组指针也被称为行指针。
5.2.指针数组*p[n]指针数组:是数组——中的指针数组。
看看下面的例子就明白了:
数组指针:指针3354是指向数组的指针。
看看下面的例子就明白了。
# include STD afx . h int main(){ int a=1;int b=2;int * p[2];p[0]=p[1]=printf(%p\n ,p[0]);//a的地址printf( % p \ n ,//a的地址printf( % p \ n ,p[1]);//b的地址printf(%p\n ,//b的地址printf(%d\n ,* p[0]);//p[0]表示A的地址,那么*p[0]表示A的值,printf(%d\n ,* p[1]);//p[1]表示B的地址,那么*p[1]表示B的值//将一个二维数组赋给指针数组int * PP[3];//一维数组中存储了三个指针变量,分别是p[0]、p[1]和p[2],所以要分别给int c[3][4]赋值;for(int I=0;I I)PP[I]=c[I];int k;scanf_s(%d ,返回0。}最后,从上面来看:
数组指针是指针变量,占用内存中指针的存储空间;
指针数组是多个指针变量,以数组的形式存储在内存中,占用多个指针的存储空间。
6、举例1typedef结构{无符号短ad[3][5][100];}照片_样本_数据_结构照片_样本_数据_结构*照片_样本_读取_基本_点,照片_样本_读取_数据;无符号短数据_0_0_x[100],数据_ 0 _ 1 _ x[100];无符号short *Photo_Sample_Point0,* Photo _ Sample _ point 1 uint 32 _ t addr void data _ init(void){ uint 16 _ t Photo _ Sample _ Line,Photo _ Sample _ time for(Photo _ Sample _ Line=0;照片_样本_行照片_样本_行){ for(照片_样本_时间=0;Photo _ Sample _ time Photo _ Sample _ time){ Photo _ Sample _ Read _ Base _ Point-ad[0][Photo _ Sample _ Line][Photo _ Sample _ time]=Photo _ Sample _ time;//第一路;照片_样本_读取_基本_点-广告[1][照片_样本_行][照片_样本_时间]=照片_样本_时间;//第二路;照片_样本_读取_基本_点-广告[2][照片_样本_行][照片_样本_时间]=照片_样本_时间;//第三路;} } } void main(){ int num=2021;printf(num addr=0x%x\r\n ,(int)num);printf(num=%d\r\n ,num);printf( \ r \ n );Photo _ Sample _ Read _ Base _ Point=Photo _ Sample _ Read _ data;data _ init();printf( Photo _ Sample _ Read _ Base _ Point addr=0x % x \ r \ n ,(int)(Photo _ Sample _ Read _ Base _ Point));printf( Photo _ Sample _ Read _ Base _ Point=% d \ r \ n ,(int)(Photo _ Sample _ Read _ Base _ Point-ad[0][0][0]);printf( \ r \ n );Photo _ Sample _ Point 0=Photo _ Sample _ Read _ Base _ Point-ad[0][0];printf( Photo _ Sample _ point 0 addr=0x % x \ r \ n ,(int)Photo _ Sample _ point 0);for(I=0;I I){ data _ 0 _ 0 _ x[I]=Photo _ Sample _ point 0[I];printf( Photo _ Sample _ point 0[% d]=0x % x \ r \ n ,I,Photo _ Sample _ point 0[I]);} printf( \ r \ n );Photo _ Sample _ Point 1=Photo _ Sample _ Read _ Base _ Point-ad[0][1];printf( Photo _ Sample _ point 1 addr=0x % x \ r \ n ,(int)Photo _ Sample _ point 1);for(I=0;I I){ printf( Photo _ Sample _ point 1[% d]=0x % x \ r \ n ,I,Photo _ Sample _ point 1[I]);data _ 0 _ 1 _ x[I]=Photo _ Sample _ point 1[I];} printf( \ r \ n );}先看输出结果:
分析1:照片_样本_读取_基础_点是指向照片_样本_读取_数据的指针。照片_样本_读取_基础_点地址是0x1000034C
分析2:照片样本点0,照片样本点一这两个指针,以及指针给数组赋值。
照片_样本_点0地址=0x1000034c
photo _ Sample _ point 1 addr=0x 10000414
照片_样本_点0[i]实际为照片_样本_读取_数据。ad[0][0][I]照片_样本_点1[i]实际为照片_样本_读取_数据。ad[0][1]7、举例2:typedef struct { unsigned char photo _ ad _ data[20][2];} photo _ sample _ stru photo _ sample _ stru * photo _ data _ point[6];静态photo _ sample _ stru PMT _ Data _ Load[6];静态无符号int Data _ Loc _ o;静态无符号int Data _ Loc _ p;void main(){ for(Data _ Loc _ o=0;Data_Loc_o Data_Loc_o ) //清空数据缓冲区{ photo _ Data _ point[Data _ Loc _ o]=PMT _ Data _ Load[Data _ Loc _ o];//PMT _ first=photo _ data _ point[0];for(Data _ Loc _ p=0;Data _ Loc _ p Data _ Loc _ p){ photo _ Data _ point[Data _ Loc _ o]-photo _ ad _ Data[Data _ Loc _ p][0]=0;photo _ Data _ point[Data _ Loc _ o]-photo _ ad _ Data[Data _ Loc _ p][1]=0;} }}结果如下:
分析:我们下面看出,photo _ sample _ stru * photo _ data _ point[6];是指向照片_样本_结构类型的指针数组(即指针的数组)。利用指针把付款_数据_加载里面数据清零。
8、举例3 #定义MAX _ SEG 100 #定义MAX_CYCLE 10 //最大循环个数的宏定义typedef uint 8 _ t UCHARtypedef struct { short RunNow//运行标志(正常开机,断电后重启)短RunEnd//运行结束标志短文件夹名[12];//目录名短文件名[12];//文件名保存年份短;//年(文件的保存时间)短SaveMonth//月(文件的保存时间)短保存日期;//日(文件的保存时间)短SaveHour//时(文件的保存时间)短SaveMinute//分(文件的保存时间)短SaveSecond//秒(文件的保存时间)short hot list//热盖设置短卷集;//样本容量短模式集;//运行的模式短TestModeSet//模拟模式短暂的第一次停顿;//首节暂停短编辑g;//节点个数编辑周期短;//循环个数短TempSet[MAX _ SEG];//节点温度短时et[MAX _ SEG];//节点时间-时短分钟集[MAX _ SEG];//节点时间-分钟short SecondSet[MAX _ SEG];//节点时间-秒短速度设置[MAX _ SEG];//速度short TempCYCSet[MAX _ SEG];//每个循环节点提升温度短分钟cset[MAX _ SEG];//分――每个循环节点增加时间short SecondCYCSet[MAX _ SEG];//秒――每个循环节点增加时间短梯度集[MAX _ SEG];//梯度短周期设置[MAX _ CYCLE];//每个循环次数短周期begin et[MAX _ CYCLE];//循环开始节点短周期endset[MAX _ CYCLE];//循环终止节点短等级xtset[6][MAX _ SEG];//独立运行信息//短独集[MAX _ SEG];//分区设置短管电视机;//试管体积短管排字;//试管类型短填充[580];//用于填充,结构总长度2Kwords }结构文件;typedef struct { unsigned long File _ Add;//地址短凹陷短cyc _ inside短cyc _外部短外部_标志短溢出标志短暂加班;short Now _ Temp } StructCalTimeStructCalTime * Cal _ PointStructCalTime Cal _ time avoid main(){ uint 8 _ t * u8 _ point;u8_point=(uint8_t*)( Cal_TimeA .file _ Add);for(uint 16 _ t I=1;I sizeof(结构时间);I)*(u8 _ point i4)=I;//赋值Cal_TimeA .File_Add=(无符号长整型)(Cal _ TimeA);//取地址Cal _ run file=*((struct file *)(Cal _ TimeA .file _ Add));//重指向//Cal _ run file=*((struct file *)((unsigned long)(Cal _ TimeA)));//直接赋值}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。