标签:struct 第一个 内存 下标 方式 部分 占用 元素 包含
C语言非常重要的一个部分,提供了访问变量的一种间接的方式——指针。通过变量的的地址我们可以访问到这个变量,回顾一下以前,我们通过:
int counter = 10;
定义了一个int型的变量并且在后面的代码中直接通过变量名counter来访问这个变量。那么现在采取一种新的方式来访问这个变量(间接访问)。我们可以:
int *counter_point = &counter;
定义了一个指针,这个指针指向了counter变量的地址。来分析一下这个语法结构:int代表了这个指针指向的地址存储的数据类型是int整型,后面counter_point是指针,前面的*是表示指针的标志。&是地址符,表明的是counter的地址。严格的来写这句话应该是:
int *counter_point;
counter_point = &counter;
如果要访问counter的值,我们现在可以通过这句话:
*counter_point直接得到counter的值,可以通过printf("counter = %i",*counter_point)函数来证实。当然还会有char型指针表示指向char数据的地址等其他类型指针。
指针和结构体:
当一个指针指向的是结构体的地址时:
struct date {
int year;
int month;
int day;
} myDate;
struct date *myDate_point = &myDate;
这时我们就可以像通常使用结构体的方式来使用:
间接访问结构体的成员变量: (*myDate_poont).year或者可以使用myDate_point->year的语法格式来使用,后者是指针特有的。
结构体中包含指针:
struct date {
int *year;
int *month;
int *day;
} myDate;
struct date *myDate_point = myDate;
myDate_point->year = &a;//假定a是一个int值变量
*myDate_point->year = a;//*的逻辑级别低于->也就是低于.
关键字const:
首先const关键字的一个用途就是对于生命的变量,数组可以用来提醒编译器和阅读代码的人其中的内容不可以修改。那么对于指针来说需要考虑更多的问题:
假定已经声明了一个字符变量c,则char *const charPtr = &c;这句话读作charPtr是一个指向字符的常量指针。值得注意的是,现在指针指向固定的地址且不可以改变。如果后面写上 charPtr = &a;则会报错,因为常量指针地址不可以更改。const第二个位置是在const char *charPtr = &c;的含义是指向一个常量字符,这个意思表示不可以通过指针改变c的值,*charPtr = ‘abc‘;则会报错。但是可以通过c本身来更改c的值。
指针和函数:
指针不仅可以指向变量的地址还可以指向函数的地址。例如: int (* point) (void)表示的是一个指向无参数但是返回一个int类型返回值的函数。这里需要展示一个事例:
1 //声明函数 2 int add(int a,int b){ 3 4 return a+b; 5 6 //指针指向函数 注意其中对影的关系 7 int (*add_point) (int num1,int num2) = &add; 8 9 NSLog(@"*add_point(3,4) = %i",(*add_point)(3,4));
指针与数组
数组的问题我在其他章节已经介绍过,现在加上指针的概念则递进一些概念和加深语法。C语言最常见的指针用法是指针指向数组。之所以使用指针指向数组是因为符号表示便利而且程序运行效率高。利用指向数组的指针编写代码可以占用少量的内存更快的运行。进入正题,我们假定有一个int类型的数组value_array[100], 则int *array_ptr = value_array;
指针指向数组时指针的类型不代表数组类型而是表示数组中包含元素的类型,虽然C语言数组类型和所包含类型一直但是还是需要格外强调一下。再者就是指向数组其实是指向了该数组的第一个元素。其次就是数组不带下标看作是指向该数组的指针并且是指向第一个元素的指针。即:
value_array = &value_array[0];
如果想要取到第i个元素就应该:
*(value_array + i - 1);
如果想要取到value_array[i]就应该:
*(value_array + i);请注意两者的区别。
到此指针的主流内容已经结束,后续会更新函数的部分。请稍等~
标签:struct 第一个 内存 下标 方式 部分 占用 元素 包含
原文地址:http://www.cnblogs.com/EngineerX/p/7594673.html