C语言中指针和数组名的用法,结构体与共用体的总结

合集下载

共用体数组指针用法

共用体数组指针用法

共用体数组指针用法在C语言中,共用体(union)是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。

共用体可以用来节省内存,因为它只分配足够的内存以容纳最大的成员,而不是为每个成员分配单独的内存。

共用体数组指针是一种特殊的数据结构,它允许我们使用指针来操作共用体数组中的元素。

下面是一个简单的示例,演示了如何使用共用体数组指针:```cinclude <>union Data {int i;float f;char str[20];};int main() {union Data data[3]; // 定义一个包含3个元素的共用体数组union Data ptr = data; // 定义一个指向共用体数组的指针// 使用指针来访问和修改共用体数组中的元素ptr[0].i = 10;ptr[1].f = ;strcpy(ptr[2].str, "Hello");// 打印共用体数组中的元素printf("data[0].i = %d\n", data[0].i);printf("data[1].f = %f\n", data[1].f);printf("data[2].str = %s\n", data[2].str);return 0;}```在上面的示例中,我们定义了一个包含3个元素的共用体数组`data`,然后定义了一个指向该数组的指针`ptr`。

通过指针`ptr`,我们可以访问和修改共用体数组中的元素。

在这个例子中,我们将`data[0]`的整数值设置为10,将`data[1]`的浮点数值设置为,将`data[2]`的字符串设置为"Hello"。

最后,我们使用`printf()`函数打印出共用体数组中的元素。

需要注意的是,由于共用体中所有成员共享同一块内存空间,因此在使用指针访问和修改共用体数组中的元素时,需要确保同一时刻只有一个成员被使用。

c语言结构体数组指针

c语言结构体数组指针

c语言结构体数组指针这是一篇介绍C语言结构体数组指针的文章,用以帮助初学者理解如何运用C语言结构体数组指针。

C语言是一种常用的高级编程语言,它经常用于开发操作系统、游戏、图形图像应用程序以及其它应用程序。

结构体数组指针是C语言中一种非常重要的语法特性,它有助于编程者更好地描述和操作复杂的数据结构。

结构体指针可用于存储一个或多个变量的地址,以便程序可以随时访问存储在指针指向的内存空间中的数据。

结构体数组指针是一种用于存储多个结构体变量的地址的指针。

要使用结构体数组指针,首先需要定义一个结构体数组:struct Person {char name[64];int age;float height;};Person people[10];定义了结构体数组之后,就可以定义一个结构体数组指针:struct Person *pp;这表示pp指向people数组的第一个元素。

在之后的程序中,可以使用pp指针来访问people数组中的每一个元素。

例如,可以使用如下语句:printf('Na %s, Age: %d, Height: %f', pp->name, pp->age, pp->height);以上代码将输出people数组中第一个元素的信息。

另外,如果要访问people数组的第二个元素,可以使用如下代码:pp++;printf('Na %s, Age: %d, Height: %f', pp->name, pp->age, pp->height);在程序中可以使用类似的方法来访问people数组中的其它元素。

要总结一下,结构体数组指针是一种常用的C语言语法特性,它可以帮助程序员更好地描述复杂的数据结构。

它由一个指针(如pp)和一个结构体数组(如people)组成,使用这种指针可以将结构体数组的元素一一访问。

C语言指针数组介绍定义指针数组输入输出指针数组

C语言指针数组介绍定义指针数组输入输出指针数组

C语言指针数组介绍定义指针数组输入输出指针数组C语言中,指针数组是一种特殊的数组类型,其中数组的每个元素都是一个指针。

指针数组允许我们存储和操作一组指针,以及通过指针访问和操作内存中的数据。

本文将介绍指针数组的定义、输入输出和常见用途。

1.定义指针数组定义指针数组的语法如下:```数据类型*数组名[大小];```其中,`数据类型`是指针指向的数据类型,`数组名`是指针数组的名称,`大小`是指针数组的大小(即元素个数)。

举个例子,如果想定义一个包含5个整型指针的指针数组,可以这样做:```int *ptrArray[5];```这个定义表示`ptrArray`是一个包含5个整型指针的数组。

输入指针数组的常见方式是使用循环结构逐个为数组元素赋值,可以使用`scanf`函数进行输入。

```for (int i = 0; i < size; i++)scanf("%d", &ptrArray[i]);```输出指针数组的常见方式是使用循环结构逐个打印数组元素的值,可以使用`printf`函数进行输出。

```for (int i = 0; i < size; i++)printf("%d\n", *ptrArray[i]);```注意这里要使用`*`操作符来访问指针指向的值。

3.指针数组的常见用途指针数组在程序设计中具有广泛的应用。

下面是一些常见的用途:-字符串数组:可以通过定义一个指针数组来存储一组字符串,每个元素都是一个指向字符串的指针。

```char *stringArray[5] = {"Hello", "World", "C", "Language", "Pointer"};```-函数指针数组:可以使用指针数组来存储不同函数的指针,以便在运行时根据需要调用特定的函数。

理解C语言(一)数组、函数与指针

理解C语言(一)数组、函数与指针

理解C语⾔(⼀)数组、函数与指针1 指针⼀般地,计算机内存的每个位置都由⼀个地址标识,在C语⾔中我们⽤指针表⽰内存地址。

指针变量的值实际上就是内存地址,⽽指针变量所指向的内容则是该内存地址存储的内容,这是通过解引⽤指针获得。

声明⼀个指针变量并不会⾃动分配任何内存。

在对指针进⾏间接访问前,指针必须初始化: 要么指向它现有的内存,要么给它分配动态内存。

对未初始化的指针变量执⾏解引⽤操作是⾮法的,⽽且这种错误常常难以检测,其结果往往是⼀个不相关的值被修改,并且这种错误很难调试,因⽽我们需要明确强调: 未初始化的指针是⽆效的,直到该指针赋值后,才可使⽤它。

 int *a;*a=12; //只是声明了变量a,但从未对它初始化,因⽽我们没办法预测值12将存储在什么地⽅int *d=0; //这是可以的,0可以视作为零值int b=12;int *c=&b;另外C标准定义了NULL指针,它作为⼀个特殊的指针常量,表⽰不指向任何位置,因⽽对⼀个NULL指针进⾏解引⽤操作同样也是⾮法的。

因⽽在对指针进⾏解引⽤操作的所有情形前,如常规赋值、指针作为函数的参数,⾸先必须检查指针的合法性- ⾮NULL指针。

解引⽤NULL指针操作的后果因编译器⽽异,两个常见的后果分别是返回置0的值及终⽌程序。

总结下来,不论你的机器对解引⽤NULL指针这种⾏为作何反应,对所有的指针变量进⾏显式的初始化是种好做法。

如果知道指针被初始化为什么地址,就该把它初始化为该地址,否则初始化为NULL在所有指针解引⽤操作前都要对其进⾏合法性检查,判断是否为NULL指针,这是⼀种良好安全的编程风格1.1 指针运算基础在指针值上可以进⾏有限的算术运算和关系运算。

合法的运算具体包括以下⼏种: 指针与整数的加减(包括指针的⾃增和⾃减)、同类型指针间的⽐较、同类型的指针相减。

例如⼀个指针加上或减去⼀个整型值,⽐较两指针是否相等或不相等,但是这两种运算只有作⽤于同⼀个数组中才可以预测。

c语言 指针的指针 用法详解

c语言 指针的指针 用法详解

c语言指针的指针用法详解在C语言中,指针是非常重要的一种数据类型。

而指针的指针是指指向指针变量的指针。

它在C语言中也是非常重要的一种数据类型,经常用于动态内存分配和函数传递参数等方面。

下面,我们来详细介绍一下指针的指针在C语言中的用法。

一、指针的基本概念在C语言中,指针是一个变量,用来表示另一个变量的内存地址。

指针变量可以存储任何数据类型的地址,包括整型、字符型、浮点型等。

使用指针可以实现动态内存分配、函数传递参数等功能。

二、指针的指针的概念指针的指针是指指向指针变量的指针。

它的定义方式如下:```int **p;```其中,p是一个指向指针的指针变量,它可以指向一个指针变量的地址。

三、指针的指针的用法指针的指针在C语言中有很多用途,下面列举几个比较常见的用法。

1.动态内存分配在C语言中,可以使用malloc函数动态分配内存,该函数返回的是一个指向分配内存的首地址的指针。

而在一些情况下,需要动态分配二维数组或者指针数组,这时就需要使用指针的指针了。

例如:```int **p;int i,j;p=(int **)malloc(sizeof(int*)*3);//分配3个指向int类型指针的指针变量for(i=0;i<3;i++){p[i]=(int*)malloc(sizeof(int)*4);//分配4个int类型的变量}for(i=0;i<3;i++){for(j=0;j<4;j++){p[i][j]=i*j;//为p[i][j]赋值}}```上述代码中,先使用malloc函数分配3个指向int类型指针的变量,然后再用循环分别为这3个变量分配4个int类型的变量。

最后,再使用嵌套循环为二维数组赋值。

2.函数传递参数在C语言中,函数可以通过指针传递参数。

指针的指针也可以用于函数传递参数,可以使函数返回多个值。

例如:```void fun(int **p){*p=(int*)malloc(sizeof(int)*4);//为指针p分配4个int类型的变量(*p)[0]=10;(*p)[1]=20;(*p)[2]=30;(*p)[3]=40;}int main(){int *p;fun(&p);//传递p的地址printf("%d %d %d %d\n",p[0],p[1],p[2],p[3]);free(p);//释放内存return 0;}```上述代码中,定义了一个指针类型的函数fun,在函数中通过指针的指针为指针p分配4个int类型的变量,并为这4个变量赋值。

C语言数组名及指向数组指针的小结

C语言数组名及指向数组指针的小结

C语言数组名及指向数组指针的小结C语言的数组名和对数组名取地址转自: /zdcsky123/article/details/6517811相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针,指向函数的入口地址。

现在有这样一个问题,如果对数组名取地址,那得到的会是什么呢?很多人立刻会想到:给指针取地址,就是指针的指针,即二级指针嘛!当然这样的结论是错误的,不然这篇笔记也就没有意义了。

下面我们来逐步分析,下面是一段验证这个问题的代码Code:1.#include<stdio.h>2.int main()3.{4.int a[10];5.6.printf("a:/t%p/n", a);7.printf("&a:/t%p/n", &a);8.printf("a+1:/t%p/n", a+1);9.printf("&a+1:/t%p/n", &a+1);10.11.return 0;12.}大家可以编译运行一下,我的输出的结果是:Code:1./*2.a: 0012FF203.&a: 0012FF204.a+1: 0012FF245.&a+1: 0012FF486.*/a和&a指向的是同一块地址,但他们+1后的效果不同,a+1是一个元素的内存大小(增加4),而&a+1增加的是整个数组的内存大小(增加40)。

既a和&a的指向和&a[0]是相同的,但性质不同!读到这里,有很多朋友已经明白其中的机制了,如果还是有些模糊,请继续往下看Code:1.int main()2.{3.int a[10];4.printf("%d/n",sizeof(a));5.return 0;6.}这段代码会输出整个数组的内存大小,而不是首元素的大小,由此我们是否联系到,sizeof(a)这里的a和&a有些相同之处呢?!是的,没错,&a取都得是整个数组的地址!既数组名取地址等价于对数组取地址。

C语言结构体与联合体的使用技巧

C语言结构体与联合体的使用技巧

C语言结构体与联合体的使用技巧C语言是一种广泛应用于软件开发领域的编程语言,而结构体和联合体是C语言中非常重要的数据类型。

结构体和联合体的灵活使用可以帮助程序员更好地组织和管理数据,提高代码的可读性和可维护性。

在本文中,我们将探讨一些结构体和联合体的使用技巧。

一、结构体的使用技巧结构体是一种用户自定义的数据类型,它可以将不同类型的数据组合在一起,形成一个新的数据类型。

结构体的定义使用关键字struct,通过定义结构体变量可以访问结构体中的各个成员。

1. 嵌套结构体嵌套结构体是指在一个结构体中定义另一个结构体变量作为成员。

通过嵌套结构体,我们可以更好地组织和管理复杂的数据结构。

例如,我们可以定义一个学生结构体,其中包含学生的基本信息(姓名、年龄等)和成绩信息(语文、数学等)。

这样,我们可以通过一个结构体变量来表示一个学生的完整信息。

2. 结构体指针结构体指针是指指向结构体变量的指针变量。

通过结构体指针,我们可以方便地访问和修改结构体中的成员。

例如,我们可以定义一个指向学生结构体的指针变量,通过该指针变量可以访问和修改学生的各个成员。

这在函数传参和动态内存分配等场景中非常有用。

3. 结构体数组结构体数组是指由多个结构体变量组成的数组。

通过结构体数组,我们可以方便地管理多个具有相同结构的数据。

例如,我们可以定义一个学生结构体数组,通过数组下标可以访问和修改每个学生的信息。

这在需要处理多个学生数据的场景中非常常见。

二、联合体的使用技巧联合体是一种特殊的数据类型,它可以在同一内存空间中存储不同类型的数据。

联合体的定义使用关键字union,通过定义联合体变量可以访问联合体中的各个成员。

1. 节省内存空间联合体可以在同一内存空间中存储不同类型的数据,这样可以节省内存空间。

联合体的大小等于最大成员的大小。

例如,我们可以定义一个联合体,其中包含一个整型成员和一个字符型成员。

当我们只使用其中一个成员时,另一个成员的内存空间就可以被重用。

C语言知识总结——宏,枚举,结构体,共用体

C语言知识总结——宏,枚举,结构体,共用体

C语言知识总结——宏,枚举,结构体,共用体1、define宏定义以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理阶段将用define定义的来内容进行了替换。

因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。

define定义的常量,预处理时只是直接进行了替换,,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。

,因此在编译时它不对宏的定义进行检查,作用域不影响对常量的访问。

它的常量值只能是字符串或数字。

该命令有两种格式:一种是简单的常量宏定义, 另一种是带参数的宏定义。

不带参数的宏:#define< 名字 >< 值 > 要注意,没有结尾的分号,因为不是C的语句,名字必须是一个单词,值可以是各种东西,宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。

如有错误,只能在编译已被宏展开后的源程序时发现。

注意.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。

宏定义其作用域为宏定义命令起到源程序结束。

如要终止其作用域可使用#undef命令带参数的宏:像函数的宏,一般的定义形式:带参宏定义的一般形式为:「#define 宏名」(形参表)字符串,也是没有结尾的分号,可以带多个参数,#define NB(a,b)((a)>(b)?(b):(a)), 也可以组合(嵌套)使用其他宏,注意带参数宏的原则一切都要有括号,参数出现的每个地方都要有括号。

带参数的宏在大型的程序的代码中使用非常普遍,在#和##这两个运算符的帮助下可以很复杂,如“产生函数”,但是有些宏会被inline函数代替(C++的函数)使用宏好处:“提高运行效”。

定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言中指针和数组名的用法,结构体与共用体的总结2010-01-11 19:38在C语言中,指针和数组名通常都可以混用。

例如char *p;访问时,*p跟p[0]是一样的,*(p+1)跟p[1]是一样的。

对于数组char b[5];访问时,b[0]跟*b是一样的,b[2]跟*(b+2)是一样的。

在一般的通信中(例如串口),通常都使用字节传输。

而像float,long int 之类的,有4字节。

我的方法就是取它的地址,强制转换为char型指针,然后当作数组来用。

float x;SBUF=((char*)&x)[0];SBUF=((char*)&x)[1];SBUF=((char*)&x)[2];SBUF=((char*)&x)[3];接收时,刚好倒过来。

更有趣的是,对于数组形式,数组名和后面的偏移量可以随便换。

char buff[10];//或者用 char *buff=&buffer;buff[3]=0xaa;3[buff]=0xaa; //两者是一样的因此,我认为编译器是这么做的:对于形如xxx[yyy]这样的表达式,会转化为*(xxx+yyy),因此写成xxx[yyy]或者写成yyy[xxx]都无所谓了...c语言结构体与共用体学习笔记1Author:yuexingtianDate:Thursday, June 12, 20081结构变量的赋值测试结果:{struct stu{int num;char *name;char sex;float score;}boy1,boy2;boy1.num=15;="yuexingtian";printf("input sex and score\n");scanf("%c %f",&boy1.sex,&boy1.score);boy2=boy1;printf("Number=%d\nName=%s\n",boy2.num,);printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);getch();}说明:本程序中用赋值语句给num和name两个成员赋值,name是一个字符串指针变量。

用scanf函数动态地输入sex和score成员值,然后把boy1的所有成员的值整体赋予boy2。

最后分别输出boy2的各个成员值。

本例表示了结构变量的赋值、输入和输出的方法。

2结构变量的初始化对结构变量的初始化(还拿上例举例)说明:本例中,boy2,boy1均被定义为外部结构变量,并对boy1作了初始化赋值。

在main函数中,把boy1的值整体赋予boy2,然后用两个printf语句输出boy2各成员的值。

3结构数组的定义例1、计算学生的平时成绩和不及格的人数struct stu{int num;char *name;char sex;float score;}boy[6]={{101,"yuexingtian",'M',88},{102,"yuechaotian",'M',98},{103,"tianyuexing",'M',96.5},{104,"tianyuechao",'M',99.5},{105,"tianjingli",'F',59.5},{106,"tianjingshan",'M',58},};main(){int i,c=0;float ave,s=0;for(i=0;i<6;i++){s+=boy[i].score;if(boy[i].score<60) c+=1;}printf("s=%f\n",s);ave=s/6;printf("average=%f\ncount=%d\n",ave,c);getch();}测试结果:说明:程序中定义了一个外部结构数组boy,共6个元素,并作了初始化赋值。

在main函数中用for语句逐个累加各元素的score 成员值存于s之中,如score的值小于60(不及格)即计数器C加1,循环完毕后计算平均成绩,并输出全班总分,平均分及不及格人数。

4建立同学录#include"stdio.h"#define NUM 3struct mem{char name[20];char phone[11];};main(){struct mem man[NUM];int i;for(i=0;i<NUM;i++){printf("input name:\n");gets(man[i].name);printf("input phone:\n");gets(man[i].phone);}printf("name\t\t\tphone\n\n");for(i=0;i<NUM;i++)printf("%s\t\t\t%s\n\n",man[i].name,man[i].phone);getch();}测试结果:说明:本程序中定义了一个结构mem,它有两个成员name和phone用来表示姓名和电话号码。

在主函数中定义man为具有mem 类型的结构数组。

在for语句中,用gets函数分别输入各个元素中两个成员的值。

然后又在for 语句中用printf语句输出各元素中两个成员值。

c语言结构体与共用体学习笔记2Author:yuexingtianDate: Saturday,june 14,20081指向结构变量的指针用此例来说明:结构指针变量的具体说明和使用方法。

struct stu{int num;char *nam e;char sex;float score;}boy1={101,"yuexingtian",'M',88.5},*pstu;main(){pstu=&boy1;printf("Number=%d\nName=%s\nSex=%c\nScore=%f\n",boy1.num,,boy1.sex,boy1.score);printf("Number=%d\nName=%s\nSex=%c\nSocre=%f\n",(*pstu).num,(*pstu).name,(*pstu).sex,(*pstu).score);printf("Number=%d\nName=%s\nSex=%c\nScore=%f\n",pstu->num,pstu->name,pstu->sex,pstu->score);getch();}测试结果:说明:本例程序定义了一个结构stu,定义了stu类型结构变量boy1并作了初始化赋值,还定义了一个指向stu类型结构的指针变量pstu。

在main函数中,pstu被赋予boy1的地址,因此pstu指向boy1。

然后在printf语句内用三种形式输出boy1的各个成员值。

从运行结果可以看出:结构变量.成员名(*结构指针变量).成员名结构指针变量->成员名这三种用于表示结构成员的形式是完全等效的。

测试结果:说明:在程序中,定义了stu结构类型的外部数组boy并作了初始化赋值。

在main函数内定义ps为指向stu类型的指针。

在循环语句for的表达式1中,ps被赋予boy的首地址,然后循环5次,输出boy数组中各成员值。

应该注意的是,一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指向一个成员。

也就是说不允许取一个成员的地址来赋予它。

因此,下面的赋值是错误的。

ps=&boy[1].sex;而只能是:ps=boy;(赋予数组首地址)或者是:ps=&boy[0];(赋予0号元素首地址)3结构指针变量作函数参数例:计算一组学生的平均成绩和不及格的人数,用结构指针变量作函数参数编程。

/*用结构指针变量作函数参数编程*/struct stu{int num;char *nam e;char sex;float score;}boy[3]={{101,"yuexingtian",'M',88},{102,"yuechaotian",'M',98},{103,"zhanghuimei",'F',45},};main(){struct stu *ps;void ave(struct stu *ps);ps=boy;ave(ps);getch();}void ave(struct stu *ps){int c=0,i;float ave,s=0;for(i=0;i<3;i++,ps++){s+=ps->score;if(ps->score<60) c+=1;}printf("s=%f\n",s);ave=s/3;printf("averaga=%f\ncount=%d\n",ave,c);}测试结果:说明:本程序中定义了函数ave,其形参为结构指针变量ps。

boy被定义为外部结构数组,因此在整个源程序中有效。

在main函数中定义说明了结构指针变量ps,并把boy的首地址赋予它,使ps指向boy数组。

然后以ps作实参调用函数ave。

在函数ave中完成计算平均成绩和统计不及格人数的工作并输出结果。

由于本程序全部采用指针变量作运算和处理,故速度更快,程序效率更高。

C语言结构体与共用体学习笔记3Author:yuexingtianDate: Tuesday,June 17,2008动态存储分配main(){struct stu{int num;char *nam e;char sex;float score;}*ps;ps=(struct stu*)m alloc(sizeof(struct stu));ps->num=15;ps->name="yuexingtian";ps->sex='M';ps->score=98.9;printf("Number=%d\nName=%s\nSex=%c\nScore=%f\n", ps->num,ps->nam e,ps->sex,ps->score);getch();}。

相关文档
最新文档