首页 > 代码库 > C语言指针学习(续)

C语言指针学习(续)

五、数组和指针的关系

int array[10] = {0,1,2,3,4,5,6,7,8,9},value;......value = http://www.mamicode.com/array[0];//也可以写成 value = *array;>

  上例中,一般而言,数组名array代表数组本身,类型是int[10];如果把array看作指针的话,它指向数组的第0个单元,类型是int *,所指向的类型是数组单元的类型 int ,因此*array = 0 就一点也不奇怪了。同理,(array+3)指向数组单元的第三个指针,所以*(array+3) = 3 ;

  

char *str[3] = {"Hellp,this is a sample","Hi ,good morning ","Hello world"};char s[80];strcpy(s,str[0]);//也可以写成 strcpy(s,*str);strcpy(s,str[1]);//也可以写成strcpy(s,*(str+1));

  上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针每个都指向一个字符串,如果把数组名看作指针的话,它指向数组的第0号元素,类型是char** ,指向的类型是 char *;

*str 也是一个指针,它的类型是char*,指向的类型是char ,它指向的地址是字符串 “Hello,this is a sample”的第一个字符H的地址。*(str+1)也是一个指针,他的类型是char*,指向的类型是char,指向“Hi,good morning”的第一个字符H的地址。

  在不同的表达式中,数组名array可以扮演不同的角色 。在表达式sizeof(array)数组名array 代表数组本身,故测出的是整个数组的大小。在表达式*array中,array扮演的是一个指针,所以该表达式就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。表达式array+n,array扮演的是指针,故array+n也是指针,他的类型是type*,指向的类型是type,指向数组第n号单元,故sizeof(array+n)测出的是指针类型的大小。

六、指针和结构类型的关系

struct mystruct{   int a ;   int b;   int c;          }mystruct ss = {20,30,40};mystruct *ptr = &ss;//声明了一个指向结构对象ss的指针,它的类型是myStruct * ,指向的类型是mystructint *pstr = (int *)&ss//声明了一个指向结构对象ss的指针。但是他的类型和它指向的类型和ptr是不同的,请问如何通过指针ptr来访问ss的三个成员变量

  答案:

ptr ->a;ptr ->b;ptr ->c;请问如何通过指针pstr来访问ss的三个成员变量答案*pstr;*(pstr+1);*(pstr+2);

  这样使用pstr来访问结构成员是不正规的。那么该怎么样来通过指针访问数组的各个单元呢?

int array[3]={35,56,37};int *pa = array;//通过指针pa访问数组array的三个单元的方法是:*pa;*(pa+1);*(pa+2);

  从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样.所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干个“填充字节”,这就导致各个成员之间可能会有若干个字节的空隙。所以,在例十二中,即使*pstr访问到了结构对象ss的第一个成员变量a,也不能保证*(pstr+1)就一定能访问到结构成员b。因为成员a和成员b之间可能会有若干填充字节,说不定*(pstr+1)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节,嘿,这倒是个不错的方法。

 

C语言指针学习(续)