龙空技术网

Linux C 编程 - 指针和结构体

大话幽默一刻 122

前言:

目前兄弟们对“c语言指针指向结构体”大约比较着重,各位老铁们都想要了解一些“c语言指针指向结构体”的相关内容。那么小编也在网络上收集了一些有关“c语言指针指向结构体””的相关内容,希望朋友们能喜欢,大家一起来学习一下吧!

结构体

首先定义一个结构体类型,然后定义这种类型的变量和指针:

struct{  char c;  int num;};struct uint u;struct unit *p = &u;

通过指针p 访问结构体成员可以写成(*p).c 和 (*p).num, 为了书写方便,还提供了-> 运算符,也可以写成p->c, p->num。

例子:打印结构体变量

#include<stdio.h>struct unit {    char c;    int num;};int main(){  struct unit u = {'a', 65};  struct unit *p = &u;  printf("%c\n", p->c);  printf("%d\n", p->num);  return 0;}
指向指针的指针和指针数组

指针可以指向基本类型,也可以指向复合类型,因此也可以指向另外一个指针变量,称为指向指针的指针。

int i;int *pi = &i;int **ppi = π

表达式*ppi取pi的值,表达式**pi取i的值。

main函数的标准原型是int main(int argc, char *argv[]); argc 是命令行参数的个数,而argv是一个指向指针的指针,函数原型中的[]表示指针而不表示数组,等价于char **argv。argv不是指向单个指针,而是指向一个指针数组的首元素。数组中每个元素都是char *指针,指向一个命令行参数字符串。

例子:打印命令行参数

#include <stdio.h>int main(int argc, char *argv[]){  int i;  for(i = 0; i < argc; i++)  {    printf("argv[%d] = %s\n", i, argv[i]);  }  return 0;}
$ gcc pointer_test.c$ ./pointer_test 1 2 3argv[0] = ./pointer_testargv[1] = 1argv[2] = 2argv[3] = 3

argv 数组

由于argv[4] 是NULL, 我们也可以这样循环遍历argv

for (i = 0; argv[i] != NULL, i++)

NULL 标识着argv的结尾,这个循环碰到NULL就结束,因而不会访问越界,这种用法很形象地称为哨兵,NULL就像一个哨兵守卫者数组的边界。

指向数组的指针与多维数组

指针可以指向复合类型,以下定义一个指向数组的指针,该数组有10个int元素:

int (*a)[10];

指针数组的定义int *a[10];相比,仅仅多了一个括号()。我们可以认为[ ]比*有更高的优先级,如果a先和*结合则表示a是一个指针,如果a先和[]结合则表示a是一个数组。int *a[10]; 这个定义可以拆分为两句:

typedef int *t;t a[10];

t代表int *类型,a则是由这种类型的元素组成的数组。int (*a)[10]; 这个定义也可以拆成为两句:

typedef int t[10];t *a;

t 代表有10个int 组成的数组类型,a 则是指向这种类型的指针。

看一下指向数组的指针如何使用:

int a[10];int (*pa)[10] = &a;

a是一个数组,在&a这个表达式中,数组名做左值,取整个数组的首地址赋给指针pa。注意,&a[0]表示数组a的首元素的首地址,而&a表示数组a的首地址,显然这两个地址的数值相同,但这两个表达式的类型是两种不同的指针类型,前者的类型是int *, 而后者的类型是int(*)[10]。*pa就表示pa所指向的数组a, 所以取数组的a[10]元素可以用表达式(*pa)[0]。注意到*pa可以写成pa[0], 所以(*pa)[0]这个表达式也可以改写成pa[0][0], pa就像一个二维数组的名字。

int a[5][10], int (*pa)[10]; 之间的关系同样类似于int a[10]; 和 int *pa; 之间的关系;a是由一种元素组成的数组,pa则是指向这种元素的指针。所以,如果pa指向a的首元素:

int a[5][10];int (*pa)[10] = &a[0];

则pa[0] 和 a[0] 取的是同一个元素,唯一比原来复杂的地方在于这个元素是由10个int 组成的数组,而不是基本类型。这样,我们可以把pa当成二维数组名来使用,pa[1][2] 和 a[1][2] 取的也是同一个元素,而且pa比a用起来更灵活,数组名不支持赋值,自增等运算,而指针可以支持,pa++是pa跳过二维数组的一行(40个字节),指向a[1]的首地址。

标签: #c语言指针指向结构体