POINTER TO STRUCTURE指向结构的指针

POINTER TO STRUCTURE指向结构的指针
POINTER TO STRUCTURE指向结构的指针

POINTER TO STRUCTURE

When a structure is defined, part of its definition is the `type' of the structure. In the example under STRUCTURE in this section, the structure type is my_struct. There may be many variables that are defined as being of type my_struct, for example var1, var2 may be defined as being of type my_struct. It is often useful to have a variable that can point to different structure variables (of the same type) at different times. This is handled by defining a variable of type Pointer To Structure.

The pointer to structure variable is defined by using the `@' symbol. The pointer to structure variable is assigned to a structure variable by using the `&' symbol.

EXAMPLE:

In the following example, a structure of type my_struct is defined, with two members.

Two variables var1 and var2 are defined which are structures of type my_struct.

A variable var_struc is defined which is a pointer to structure variable which points to structures of type my_struc. The members of var1 and var2 have values assigned to them. Note the use of the member pointer (.) in assignments. Then var_struc is assigned to point to var1 using the & symbol. The values of the members of the structure pointed to by var_struc are written out. Note that the symbol (->) replaces the use of the member pointer (.) when accessing members for pointer to structure variables.

------- definition of structure -----------------

structure my_struct

-- members of structure

ii : integer

rr : real

endstructure

-------- variable definitions --------------------

var

-- variables defined as being of type my_struct

var1,var2 : my_struct

-- variable defined as being a pointer to structures

-- of type my_struct

var_struc : @my_struct

procedure struct_demo()

begin

-- assign values to the variables for their members

-- note the use of the period

var1.ii = 100

var2.ii = 200

var1.rr = 1.1

var2.rr = 2.2

-- set the structure pointer to point to the structure

-- var1 note the use of &

var_struc = &var1

-- write out the values of the members of var_struc

-- note the use of ->

write (var_struc->ii,' ',var_struc->rr,cr)

-- set the structure pointer to point to the structure

-- var2 note the use of &

var_struc = &var2

-- write out the values of the members of var_struc

-- note the use of ->

write (var_struc->ii,' ',var_struc->rr,cr)

end

指向结构

当一个结构的定义,其定义的一部分是该结构的`型'。在本节下结构的例子中,结构类型为MY_STRUCT。有可能是,被定义的类型是MY_STRUCT,例如var1的许多变量,VAR2可以被定义为类型MY_STRUCT的。它是非常有用的是具有可在不同的时间点,以不同的结构变量(同一类型的)的一个变量。这是通过定义类型的指针变量来构造处理。

以结构体变量的指针是通过使用'@'符号定义。以结构体变量的指针是通过使用'&'符号分配给一个结构体变量。

示例:

在下面的例子中,类型MY_STRUCT的结构定义,有两个成员。

两个变量var1和定义它的类型是MY_STRUCT的结构。

变量var_struc定义它是一个指向结构体变量,它指向型my_struc的结构。var1和成员都分配给他们的价值观。注意:在分配使用的成员指针()的。然后var_struc被分配到使用点的&符号VAR1。结构的成员的值指向var_struc都写了出来。需要注意的是符号- ()(>)取代了使用该成员指针访问成员指针,结构体变量的时候。

-------结构的定义-----------------

结构MY_STRUCT

- 结构的成员

二:整数

RR:实

endstructure

--------变量定义--------------------

变种

- 定义为类型MY_STRUCT变量

VAR1,VAR2:MY_STRUCT

- 变量定义为一个指向结构

- 类型MY_STRUCT的

var_struc:@ MY_STRUCT

程序struct_demo()

开始

- 赋值给变量及其成员

- 注意使用期限

var1.ii=100

var2.ii=200

var1.rr=1.1

var2.rr=2.2

- 设置结构指针以指向结构

- VAR1注意使用&

var_struc=&VAR1

- 写出来var_struc的成员的值

- 注意使用- >

写(var_struc - >二,'',var_struc - > RR,CR)- 设置结构指针以指向结构

- VAR2注意使用&

var_struc=&VAR2

- 写出来var_struc的成员的值

- 注意使用- >

写(var_struc - >二,'',var_struc - > RR,CR)结束

结构体指针

C++语言结构体和指针 指针也可以指向一个结构体,定义的形式一般为: struct结构体名*变量名; 下面是一个定义结构体指针的实例: 上述代码已经测试。 注意:定义已经命名的结构体指针的时候必须用已命名结构体类型定义的结构体变量的地址进行初始化。 也可以在定义结构体的同时定义结构体指针: 上述代码已经测试 注意,结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必 pstu赋值只能写作: struct stu *pstu = &stu1; 而不能写作: struct stu *pstu = stu1; 还应该注意,结构体和结构体变量是两个不同的概念:结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。下面的写法是错误的,不可能去取一个结构体名的地址,也不能将它赋值给其他变量: struct stu *pstu = &stu; struct stu *pstu = stu;

获取结构体成员 通过结构体指针可以获取结构体成员,一般形式为: (*pointer).memberName 或者: pointer->memberName 对了。 ,有了它,可以通过结构体指针 直接取得结构体成员;这C语言中的唯一用途。 上面的两种写法是等效的,我们通常采用后面的写法,这样更加直观。

运行结果: Name Num Age Group Score Zhou ping 5 18 C 145.0 Zhang ping 4 19 A 130.5 Liu fang 1 18 A 148.5 Cheng ling 2 17 F 139.0 Wang ming 3 17 B 144.5 结构体指针作为函数参数 结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。 要铭记的一点就是:数组名称始终代表数组的指针指向第一个元素,数组名称加一始终指向下一个数组元素。

C指针函数习题

C++指针函数习题 一、选择题 1.以下程序的运行结果是()。 sub(int x, int y, int *z) { *z=y-x; } void main() { int a,b; sub(10,5,&a); sub(7,a,&b); cout< #include<>

指针变量作为函数参数

用名作为其他变量名地别名. ; 等价于; ()声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名地一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元.故:对引用求地址,就是对目标变量求地址.与相等. ()不能建立数组地引用.因为数组是一个由若干个元素所组成地集合,所以无法建立一个数组地别名. 引用应用 、引用作为参数 引用地一个重要作用就是作为函数地参数.以前地语言中函数参数传递是值传递,如果有大块数据作为参数传递地时候,采用地方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序地效率.但是现在(中)又增加了一种同样有效率地选择(在某些特殊情况下又是必须地选择),就是引用. 【例】: ( , ) 此处函数地形参, 都是引用 { ; ; ; ; } 为在程序中调用该函数,则相应地主调函数地调用点处,直接以变量作为实参进行调用即可,而不需要实参变量有任何地特殊要求.如:对应上面定义地函数,相应地主调函数可写为: ( ) { ; >>>>; 输入两变量地值 (); 直接以变量和作为实参调用函数 <<<< ' ' <<; 输出结果 }

上述程序运行时,如果输入数据并回车后,则输出结果为. 由【例】可看出: ()传递引用给函数与传递指针地效果是一样地.这时,被调函数地形参就成为原来主调函数中地实参变量或对象地一个别名来使用,所以在被调函数中对形参变量地操作就是对其相应地目标对象(在主调函数中)地操作. ()使用引用传递函数地参数,在内存中并没有产生实参地副本,它是直接对实参操作;而使用一般变量传递函数地参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量地副本;如果传递地是对象,还将调用拷贝构造函数.因此,当参数传递地数据较大时,用引用比用一般变量传递参数地效率和所占空间都好. ()使用指针作为函数地参数虽然也能达到与使用引用地效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"地形式进行运算,这很容易产生错误且程序地阅读性较差;另一方面,在主调函数地调用点处,必须用变量地地址作为实参.而引用更容易使用,更清晰. 如果既要利用引用提高程序地效率,又要保护传递给函数地数据不在函数中被改变,就应使用常引用. 、常引用 常引用声明方式:类型标识符引用名目标变量名; 用这种方式声明地引用,不能通过引用对目标变量地值进行修改,从而使引用地目标成为,达到了引用地安全性. 【例】: ; ; ; 错误 ; 正确 这不光是让代码更健壮,也有些其它方面地需要. 【例】:假设有如下函数声明:

结构体的指针应用

什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以作为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同。 定义结构体使用struct修饰符,例如: struct test { float a; int b; }; 上面的代码就定义了一个名为test的结构体,它的数据类型就是test,它包含两个成员a和b,成员a的数据类型为浮点型,成员b的数据类型为整型。由于结构体本身就是自定义的数据类型,定义结构体变量的方法和定义普通变量的方法一样。 test pn1; 这样就定义了一个test结构体数据类型的结构体变量pn1,结构体成员的访问通过点操作符进行,pn1.a=10 就对结构体变量pn1的成员a进行了赋值操作。注意:结构体生命的时候本身不占用任何内存空间,只有当你用你定义的结构体类型定义结构体变量的时候计算机才会分配内存。 结构体,同样是可以定义指针的,那么结构体指针就叫做结构指针。 结构指针通过->符号来访问成员,下面我们就以上所说的看一个完整的例子: #include #include using namespace std; struct test//定义一个名为test的结构体 { int a;//定义结构体成员a int b;//定义结构体成员b }; void main() { test pn1;//定义结构体变量pn1 test pn2;//定义结构体变量pn2 pn2.a=10;//通过成员操作符.给结构体变量pn2中的成员a赋值 pn2.b=3;//通过成员操作符.给结构体变量pn2中的成员b赋值

指针和结构体练习题

第十章指针 一?选择题 1.变量的指针,其含义是指该变量的 _______________ A )值 B )地址 C )名 D )一个标志 2.已有定义int k=2;int *ptr1,*ptr2; 且ptr1和ptr2 均已指向变量 k ,下面不能正确执行 的赋值语句是 。 A ) k=*ptr1+*ptr2 B ) ptr2=k C ) ptr1=ptr2 D ) k=*ptr1*(*ptr2) 3.若有说明:int *p,m=5,n; 以下程序段正确的是 。 A ) p=&n ; B ) p = &n ; scanf( %d ",&p); scanf( %d ",*p); C ) scanf( %d",&n); D ) p = &n ; *p=n ; *p = m ; 4.已有变量定义和函数调用语句: int a=25;print_value(&a); 下面函数的输出结果 void prin t_value(i nt *x) { printf( %d\n ”++*x); } A) 23 B )24 C ) 25 D )26 5. 若有说明:int *p1, *p2,m=5,n; _____________ 以下均是正确赋值语句的选项是 B) p 仁&m; p2=&n; *p1 =* p2 ; C) p 仁&m; p2=p1 ; D ) p 仁&m; *p 仁*p2 ; 6. 若有语句:int *p,a=4; 和p=&a ;下面均代表地址的一组选项是 _ A) a,p,*&a B )&*a,&a,*p C )*&p,*p,&a D ) &a,&*p,p 7. 下面判断正确的是 ______________ 。 A) char *a= "ch in a ” 等价于 char *a; *a= "ch in a "; B) char str[1O]={ “hina ”;等价于 char str[1O]; str[ ]={ “hina";} C) char *s= "ch in a "; 等价于 char *s; s= "ch in a "; D) char c[4]= "abc ",d[4]= "abc ";等价于 char c[4]=d[4]= "abc "; 8. _______________________________________________ 下面程序段中,for 循环的执行次数是 ______________________________________________________ 。 char *s= "\ta\018bc "; for ( ; *s!= '\0'; s++) printf( *” A) 9 B ) 7 9. 下面能正确进行字符串赋值操作的是 A) char s[5]={ ABCDE ”; C ) char *s ; s= "ABCDE "; 10. 下面程序段的运行结果是 ________ char *s= "abcde"; s+=2 ; printf( %d",s); A) cde B )字符'' C )字符’c'的地址 D )不确定 11. 设pl 和p2是指向同一个字符串的指针变量, c 为字符变量,则以下不能正确执行的赋 值语句是 ________________ 。 A) c=*p1+*p2 B ) p2=c C ) p 仁p2 D ) c=*p1*(*p2) A ) p 仁&m; p2=&p1 ; C ) 6 D ) 5 B ) char s[5]={ A \'\'C','D','E '; D ) char *s; scanf( %s",s);

指向函数的指针

指向函数的指针 c/c++ 2010-11-20 13:17:02 阅读41 评论0 字号:大中小订阅首先看这个程序: #include using namespace std; void max(int a, int b) { cout<<"now call max("<b?a:b; cout<

我曾经写过一个命令行程序,有很多命令,于是构着了一个结构的数组,大概是这样 struct{ char *cmd_name; bool (*cmd_fun)(); }cmd_info_list[MAX_CMD_NUM]; 程序中得到一个用户输入的命令字符串后,就匹配这个数组,找到对应的处理函数。 以后每次添加一个命令,只需要加个函数,然后在这个数组中加一个记录就可以了,不需要修改太多的代码。 这可以算是一种用法吧。呵呵。 Windows 中,窗口的回调函数就用到了函数指针。 用VC向导 New Projects ----> Win32 Application ----> A typical "Hello World!" application 其中的WndProc 是WNDPROC 类型的函数typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM); WndProc 作为窗口的回调函数,用来填充WNDCLASSEX 结构。 WNDCLASSEX wcex; wcex.lpfnWndProc = (WNDPROC)WndProc; void ListTraverse(LinkList L,void (*visit)(int)) { Link p; p=L->next; while(p) { visit(p->data); p=p->next; } return OK; } void print(int c) { printf("%d",c); } ListTraverse(L,print); 这算是个例子吧??? #include #include #include double Add (double x, double y) { return x+y; } double Sub (double x, double y) { return x-y; } double Mul (double x, double y)

指针和结构体练习题.

第十章指针 一.选择题 1.变量的指针,其含义是指该变量的。 A)值 B)地址 C)名 D)一个标志 2.已有定义int k=2;int *ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是。 A)k=*ptr1+*ptr2 B)ptr2=k C)ptr1=ptr2 D)k=*ptr1*(*ptr2 3.若有说明:int *p,m=5,n;以下程序段正确的是。 A)p=&n ; B)p = &n ; scanf(“%d”,&p; scanf(“%d”,*p; C)scanf(“%d”,&n; D)p = &n ; *p=n ; *p = m ; 4.已有变量定义和函数调用语句:int a=25;print_value(&a;下面函数的输出结果是。 void print_value(int *x { printf(“%d\n”,++*x; } A)23 B)24 C)25 D)26 5.若有说明:int *p1, *p2,m=5,n;以下均是正确赋值语句的选项是。 A)p1=&m; p2=&p1 ; B)p1=&m; p2=&n; *p1=*p2 ; C)p1=&m; p2=p1 ; D)p1=&m; *p1=*p2 ; 6.若有语句:int *p,a=4;和p=&a;下面均代表地址的一组选项是。 A)a,p,*&a B)&*a,&a,*p C)*&p,*p,&a D)&a,&*p,p 7.下面判断正确的是。 A)char *a=”china”; 等价于char *a; *a=”china” ; B)char str[10]={“china”}; 等价于char str[10]; str[ ]={“china”;}

C语言中不同的结构体类型的指针间的强制转换详解

C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理解了其内部机制,你会发现C是非常灵活的。 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在结构体中的偏移地址。 变量的值是以二进制形式存储在内存中的,每个内存字节对应一个内存地址,而内存存储的值本身是没有整型,指针,字符等的区别的,区别的存在是因为我们对它们有不同的解读,param的值就是一个32位值,并且存储在某个内存单元中,通过这个32位值就能找到param所指向的结构的起始地址,通过这个起始地址和各个结构所包含变量离起始地址的偏移对这些变量进行引用, param->bIsDisable只是这种引用更易读的写法,只要param是指向 PAINT_PARAM的指针,那么param的值就肯定存在,param存在,偏移量已知,那么param->bIsDisable就肯定存在,只是要记住,param->bIsDisable只是代表了对param一定偏移地址的值。 不是说某个地址有那个结构体你才能引用,即使没有,你也能引用,因为你已经告诉了编译器param变量就是指向一个PAINT_PARAM结构体的变量并且指明了param的值,机器码的眼中是没有数据结构一说的,它只是机械的按照 指令的要求从内存地址取值,那刚才的例子来说,peg->x,peg->y的引用无论 0x30000000是否存在一个eg结构体都是合法的,如果0x30000000开始的8 个字节存在eg结构体,那么引用的就是这个结构体的值,如果这个位置是未定义的值,那么引用的结果就是这8个字节中的未定义值,内存位置总是存在的,而对内存中值的引用就是从这些内存位置对应的内存单元取值。 举个例子: typedefstruct_eg { int x; int y; }eg;

指针在结构体中的应用.

实验14 指针在结构体中的应用 一、实验目的 1.掌握结构体类型指针的定义及使用方法。 2.掌握结构体类型指针作为函数参数,实现函数调用。 3.掌握简单链表的基本操作。 二、实验要求 1.通过阅读及编程,掌握结构体类型指针的定义及使用方法。 2.通过阅读及编程,掌握结构体类型指针作为函数参数,实现函数调用。 3.通过阅读及编程,掌握简单链表的基本操作(包括链表的建立、查找、遍历、插入、删除)。 三、实验内容 1.阅读下列程序,预测程序运行结果,然后上机验证。 main () { struct num { int a ; int b ; float f ; } n={ 1 , 3, 5.0 }; struct num * pn =&n ; printf ( “ %d\n ” , ( pn->b/n.a )*(++pn ->b) ); printf ( “ %f \n ” , ( *pn ).a + pn ->f ); } 1.读下列程序,指出程序的功能。 struct tm { int hours ; int minutes ; int seconds ; }; main ( ) { struct tm time ; time. hours=0 ; time. minutes =0; time . seconds =0 ;

for ( ; ; ) { update ( &time ); display (&time ); } } update ( struct tm * t ) { t-> seconds++; if ( t-> seconds= =60 ) { t-> seconds=0; t-> minues++; } if ( t-> minues= =60 ) { t-> minues=0; t-> hours++; } if ( t-> hours= =24 ) t-> hours=0; deday ( ); } display ( struct tm * t ) { printf ( “%d: ” , t-> hours ); printf ( “%d: ” , t-> minutes ); printf ( “%d:\n” , t-> seconds ); } delay ( ) { long int t; for ( t=1; t<12800 ; ++t ); } 3. 阅读并运行下列程序,写出运行结果。 #include “stdio.h” main ( ) { struct person { char name[20];

指针与结构体 上机

指针 1.在主函数中输入一个字符串str,调用函数统计字符串中出现的字母(含大 小写)、数字、空格及其他字符出现的次数,在主函数中输出统计结果。要求写三个版本的程序:(1)用指针作参数返回统计结果。(2)用引用做参数返回统计结果(引用做参数效率更高,代码更简单。)(3)用数组做参数返回统计结果(当返回多个同类型结果时用数组做参数更简单)。 1.#include using namespace std; void stat(char *str,int *letters,int *digits,int *others){ char c; for(char *str;*str!='\0';str++) {c=*str; if((c>'a'&&c<'z')||(c>'A'&&c<'Z')) (*letters)++; else if('0'<=c&&c<='9') (*digits)++; else (*others)++; } } void main(){ char str[100]; cin.getline(str,100); int letters=0; int digits=0; int others=0; stat(str,&letters,&digits,&others); cout<<"letters="< #include using namespace std; void stat(char *str,int *a){ char c; for(int i=0;str[i]!='\0';i++) {c=str[i];

结构指针

题目内容: 定义一个学生的结构体,包含姓名,年龄,身高从键盘输入一组学生信息 结果打印4组数据 输入样例 Tom 20 1.70 输出 Tom0 20 1.70 Tom1 21 1.71 Tom2 22 1.72 Tom3 23 1.73 输入描述 从键盘输入一组学生信息 结果打印3组数据 输入样例 Tom 20 1.70 输出描述 结果打印4组数据 输出 Tom0 20 1.70 Tom1 21 1.71 Tom2 22 1.72 Tom3 23 1.73 输入样例 Tom 20 1.70 输出样例 Tom0 20 1.70 Tom1 21 1.71 Tom2 22 1.72 Tom3 23 1.73 程序代码

for(i=0;i<4;i++) printf("%s%d %d %.2f\n",https://www.360docs.net/doc/5211548872.html,,i,a.age+i,a.high+i *0.01); return 0; } 2.c-05-1 回文句子 (10分) C时间限制:3000 毫秒 | C内存限制:3000 Kb 题目内容: "回文句"是一种句型,一个句子如果正着读与倒着读的意思一样,就可以称为"回文句"。 如:蜜蜂酿蜂蜜;风扇能扇风;奶牛产牛奶;清水池里池水清;静泉山上山泉;上海自来水来自海上;雾锁山头山锁雾;天连水尾水连天;门盈喜气喜盈门。 在英文中也是有回文的,而且是一种非常有趣的修辞,即palindrome,其结构跟中文是 一个道理。英文回文举例: Able was I ere I saw Elba。(在我看到厄尔巴岛之前,我曾所向无敌) Madam, I' m Adam.(女士, 我是Adam) Was it a bar or a bat I saw? (我看到的是酒吧还是蝙蝠?) 编写一个函数,判断给定英文句子是不是回文句。 输入描述 输出描述 输入样例 输入样例1: Madam, I' m Adam. 输入样例2:

C语言结构指针

C语言结构指针 这篇文章是九九年写的,这篇文章适合中级程序员。有不明白之处不要紧,多看几遍,然后花些时间上机操作及认真思考每个问题。遇到难题要研究、解决,难题出现于哪里?该用什么方式来解决?为什么要选择这个方式解决?有其它的解决方法吗?这样的解决方案完美吗?其实做个程序员这些基本的思考心得是要掌握的。记住;遇问题不要逃避,要面对现实、勇于挑战,仔细研究难题的所在,这样相信你会成功的! 指针结构与指针的关系亦有两重:其一是在定义结构时,将指针作为结构中的一个成员;其二是指向结构的指针(称为结构指针)。前者同一般的结构成员一样可直接进行访问,后者是本节讨论的重点。 结构指针说明的一般形式是: struct 结构类型名称* 结构指针变量名; 例如:struct date * pdate, today; 说明了两个变量,一个是指向结构date的结构指针pdate,today是一个date结构变量。语句: pdate = &today; pdate today (struct date) year month day 通过结构变量today访问其成员的操作,也可以用等价的指针形式表示: today.year = 2001;等价于(*pdate).year = 2001;

由于运算符"*"的优先级比运算符"."的优先级低,所以必须有"( )"将*pdate括起来。若省去括号,则含义就变成了"*(pdate.year)"。 在C语言中,通过结构指针访问成员可以采用运算符"->"进行操作,对于指向结 构的指针,为了访问其成员可以采用下列语句形式: 结构指针->成员名; 这样,上面通过结构指针pdate访问成员year的操作就可以写成: pdate->year = 2001; 如果结构指针p指向一个结构数组,那么对指针p的操作就等价于对数组下标的操作。 结构指针是指向一种结构类型的指针变量,它是结构在内存中的首地址,结构指针具有一般指针的特性,如在一定条件下两个指针可以进行比较,也可以与整数进行加减。但在指针操作时应注意:进行地址运算时的放大因子由所指向的结构的实际大小决定。 例11-7:用结构指针改写加密程序。 #include "stdio.h" struct table { char input, output; } ; struct table translate[ ]= { 'a', 'd', 'b', 'w', 'c', 'k', 'd', ';' , 'e', 'i', 'i', 'a', 'k', 'b', ';', 'c', 'w', 'e' }; /* 建立加密对照表*/ main( ) { char ch; struct table *p, *pend; /* p和pend为指向结构table的指针*/ pend = & translate[ sizeof(translate)/sizeof(struct table)-1 ]; /* pend指向结构数组translate的最后一个元素*/ while ( (ch=getchar( )) != '\n')

C语言——指向函数的指针

1函数类型(* 函数指针变量)();//指向函数的入口地址 一个函数是若干语句的集合,经编译后存储在函数代码存储区,并占有一片连续的存储空间,对函数指针只能用函数名赋值而无其他运算 1#include 2 3int max(int x ,int y); 4 5int main() 6{ 7int(* p)() ;//定义p是指向函数的指针变量 8int a , b , c ; 9 10p= max ;//将函数max的入口地址赋给指针变量p 11scanf("%d %d",&a ,&b) ; 12c= (* p)(a , b) ;//用指向函数的指针变量p调用函数 13printf("a = %d , b = %d , max = %d", a , b , c); 14 15return0; 16} 17 18int max(int x ,int y) 19{ 20int k ; 21k= (x> y)? x : y ; 22 23return k ; 24} 函数名作为实际参数: 1 #include 2 3int fun1(int a , int b) 4 { 5return a+b ; 6 } 7 8int fun2(int (*q)() , int x , int y) 9 { 10return (*q)(x , y) ; 11 } 12 13int main() 14 { 15int (*p)() , k ; 16 p = fun1 ;

17 k = fun2( p , 8 , 5 ) ; 18 19printf("k = %d \n" , k); //输出 13 20 21return0 ; 22 } 设置一个函数proc ,每次调用它会实现不同的功能,输入 a , b 两个数,第一次调用proc时,找出两者中最大者,第二次找出最小者,第三次调用求两数之差: 1 #include 2 3int max(int *x , int *y); 4int min(int *x , int *y); 5int a_b(int *x , int *y); 6int proc(int *x , int *y , int(*p)()); 7 8int main() 9 { 10int a , b ; 11 12printf("Enter a and b :"); 13scanf("%d %d" , &a , &b); 14 15printf("a = %d \t b = %d \n" , a , b); 16 17printf("max(%d,%d) = " , a , b); 18 proc(&a , &b , max); 19 20printf("min(%d,%d) = " , a , b); 21 proc(&a , &b , min); 22 23printf("%d - %d = " , a , b); 24 proc(&a , &b , a_b); 25 26return0 ; 27 } 28 29int max(int *x , int *y) 30 { 31int k ; 32 33 k = (*x > *y) ? *x : *y ; 34 35return k ; 36 } 37 38int min(int *x , int *y)

指向对象的指针变量

指向对象的指针变量 定义的一般形式: 类名*指针变量名; p-> (*p). 指向对象的成员变量的指针变量: 1.该指针变量可出现在成员函数中,通过获取该成员变量的地址,然后通过(*指针变量名)访问该成员变量 class aa { int a; public: aa() { a=0; } aa(int a) { this->a=a; } void get_a() { int *p; p=&a; cout<<*p<a=a; } void get_a() { int *p; p=&a; cout<<*p<

} }; int main() { aa b(3); b.get_a(); aa *p; p=new aa[2]; (p+1)->get_a(); p[1].get_a(); int *q; q=&b.a; return 0; } 指向成员函数的指针变量: 定义的一般形式: 函数类型名(类名::*指针变量名)(参数); 赋值的一般形式: 指针变量名=对象名.成员函数名 指针变量名=&类名.成员函数名或指针变量名=类名.成员函数名通过指针变量引用对象的成员函数 一般形式:(对象名.*指针变量名)(参数) this指针 #include using namespace std; class aa { int a; public: aa() { a=0; } aa(int a) { this->a=a; } void get_a() { cout<a<

C语言复习题指针结构体

C语言复习题_指针&结构体 一、选择 1、若有以下定义:char s[20]="programming",*ps=s; 则不能代表字符'o'的表达式是A。 A) ps+2 B) s[2] C) ps[2] D) ps+=2,*ps 2、若有以下定义和语句: int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则不能表示a数组元素的表达式是B。 A) *p B) a[10] C) *a D) a[p-a] 3、已知int *p,a; p=&a; 这里的运算符& 的含义D。 A) 位与运算B) 逻辑与运算C) 取指针内容D) 取变量地址 4、定义结构体如下: struct student { int num; char name[4]; int age; }; 则printf(“%d”,sizeof(struct student))的结果为: 12。 5、若有定义如下:int i=3,*p=&i; 显示i的值的正确语句是B。 A) printf(“%d”,p); B) printf(“%d”,*p); C) printf(“%p”,*p); D) printf(“%p”,p); 6、在定义结构体时,下列叙述正确的是A。 A) 系统不会分配空间 B) 系统会按成员大小分配空间 C) 系统会按最大成员大小分配空间 D) 以上说法均不正确 7、指针是一种D。 A) 标识符B) 变量C) 运算符D) 内存地址 8、定义struct s {int x; char y[6];} s1;,请问正确的赋值是C。 A) s1.y=”abc”; B) s1->y=”abc”; C) strcpy(s1.y,”abc”); D) s1.strcpy(y,”abc”); 9、已知定义“int x =1, *p”,则合法的赋值表达式是A。 A) p =&x B) p = x C) *p =&x D) *p =*x

POINTER TO STRUCTURE指向结构的指针

POINTER TO STRUCTURE When a structure is defined, part of its definition is the `type' of the structure. In the example under STRUCTURE in this section, the structure type is my_struct. There may be many variables that are defined as being of type my_struct, for example var1, var2 may be defined as being of type my_struct. It is often useful to have a variable that can point to different structure variables (of the same type) at different times. This is handled by defining a variable of type Pointer To Structure. The pointer to structure variable is defined by using the `@' symbol. The pointer to structure variable is assigned to a structure variable by using the `&' symbol. EXAMPLE: In the following example, a structure of type my_struct is defined, with two members. Two variables var1 and var2 are defined which are structures of type my_struct. A variable var_struc is defined which is a pointer to structure variable which points to structures of type my_struc. The members of var1 and var2 have values assigned to them. Note the use of the member pointer (.) in assignments. Then var_struc is assigned to point to var1 using the & symbol. The values of the members of the structure pointed to by var_struc are written out. Note that the symbol (->) replaces the use of the member pointer (.) when accessing members for pointer to structure variables. ------- definition of structure ----------------- structure my_struct -- members of structure ii : integer rr : real endstructure -------- variable definitions -------------------- var -- variables defined as being of type my_struct var1,var2 : my_struct -- variable defined as being a pointer to structures -- of type my_struct var_struc : @my_struct procedure struct_demo() begin -- assign values to the variables for their members -- note the use of the period var1.ii = 100 var2.ii = 200

c语言结构体指针初始化===

c语言结构体指针初始化 今天来讨论一下C中的内存管理。 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左右孩子指针使用时难道有初始化吗 那时我不知怎么的想不出理由,虽然我还是坚信要初始化的 过了几天这位同事说他试了一下,结构体中的成员指针不经过初始化是可以用(左子树和右子树指针) 那时在忙着整理文档,没在意 今天抽空调了一下,结论是,还是需要初始化的。 而且,不写代码你是不知道原因的(也许是对着电脑久了IQ和记性严重下跌吧) 测试代码如下 1.#include 2.#include 3.#include 4. 5.struct student{ 6.char *name; 7.int score; 8.struct student* next; 9.}stu,*stu1; 10. 11.int main(){ 12. https://www.360docs.net/doc/5211548872.html, = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/ 13. strcpy(https://www.360docs.net/doc/5211548872.html,,"Jimy"); 14. stu.score = 99; 15. 16. stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/ 17. stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/ 18. stu.next = stu1; 19. strcpy(stu1->name,"Lucy"); 20. stu1->score = 98; 21. stu1->next = NULL; 22. printf("name %s, score %d \n ",https://www.360docs.net/doc/5211548872.html,, stu.score); 23. printf("name %s, score %d \n ",stu1->name, stu1->score); 24. free(stu1); 25.return 0; 26.} #include #include #include struct student{ char *name; int score; struct student* next; }stu,*stu1; int main(){ https://www.360docs.net/doc/5211548872.html, = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/ strcpy(https://www.360docs.net/doc/5211548872.html,,"Jimy"); stu.score = 99; stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/ stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/ stu.next = stu1; strcpy(stu1->name,"Lucy"); stu1->score = 98; stu1->next = NULL; printf("name %s, score %d \n ",https://www.360docs.net/doc/5211548872.html,, stu.score);

相关文档
最新文档