C语言的指针大归纳【三大关系】(Five)

一、指针与数组的关系

怎么开个头呢?一直以来,我都在梳理自己的逻辑思路。接下来我的思路是这样的——>“从结构说功能”。

数组名,是数组的唯一标识符。
数组名具有二义性。
但数组的数组名其实可以看作一个指针。

给个例子:

int array[10]={0,1,2,3,4,5,6,7,8,9};
int var;
var=array[0]; //<=等价=>var=*array;
var=array[3]; //<=等价=>var=*(array+3);
var=array[4]; //<=等价=>var=*(array+4);

解析:

上面的例子中数组名array 代表数组本身,类型==>int[10],
把array 看做指针,它指向数组的第0 个单元,类型==>int* ,
所指向的类型==>int。
即   *array ==0 ;array+3 是一个指向数组第3 个单元的指针,
*(array+3)==3。

再来一个字符数组:

char *str[5]=
{
"Hello World One!",
"Hello World Two!",
"Hello World Three!",
 "Hello World Four!",
 "Hello World Five!",
};
char s[1024];   //给char s 申请空间
strcpy(s,str[0]); //<=等价=>strcpy(s,*str);
strcpy(s,str[1]); //<=等价=>strcpy(s,*(str+1));
strcpy(s,str[2]); //<=等价=>strcpy(s,*(str+2));
strcpy(s,str[3]); //<=等价=>strcpy(s,*(str+3));
strcpy(s,str[4]); //<=等价=>strcpy(s,*(str+4));

解析:(由读者自己试着分析一下)

注意:字符串相当于是一个数组,在内存中以数组的形式储存,
只不过字符串是一个数组常量,内容不可改变,且只能是右值。
如果从语法的角度看成指针的话,他即是常量指针,也是指针常量。
【提示】:
 (1)str 是一个五单元的数组,而且数组的每个单元都是一个指针,
这些指针各指向一个字符串。
(2) str+1 是一个指针,它指向数组的第1 号单元,它的类型为char**,指向的类型是char*。
*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,
  它指向 "Hello World Two!"的第一个字符'H'。

来个比较有难度的:

int array[5];
int (*ptr)[5];
ptr=&array;  //在此语句中,array 代表数组本身。

解析:

毫无疑问,ptr 是一个指针,它的类型为int(*)[10],它指向的类型是
int[5] 。
来做几道题,
【引子】:sizeof(指针名称)测出的是是指针自身类型的大小。
都以32位机为测试。
int(*ptr)[5];    
sizeof(int(*)[5])==4
sizeof(int[5])==20
sizeof(ptr)==4
【笔者自己在Linux和window测试的结果一样,这里就不上图了】

 总结一下数组的数组名(数组中储存的也是数组):
【一】、数组名的二义性:
在声明了一个数组TYPE array[n],
 【a】、数组名代表整个数组,它的类型是TYPE[n];
 【b】,数组名是一个常量指针,该指针的类型是TYPE*,
  该指针指向的类型是TYPE,也就是数组 单元的类型,
  该指针指向的内存区就是数组第0 号单元,
  该指针在内存上自己占 有单独的内存区,
  而且它和数组第0 号单元占据的内存区是不同的。
 该指针的值是不能修改的,==>【array++的表达式是错误的。】

在sizeof函数中;
sizeof(array)   ==>测出的是整个数组的大小。//【数组本身】
sizeof(*array)  ==>测出的是数组单元的大小。// 【数组第0 号单元的值】
sizeof(array+n)  ==>测出的是指针类型的大小。// 【指针,指向数组第n 号单元】

二、指针与结构体的关系

可以声明一个指向结构类型对象的指针。

struct MyStruct
{
  int a;
  int b;
  int c;
};
//  初始化结构体:
struct MyStruct s={0,1,2};  //声明了结构对象s

// 声明指针来指向s
struct MyStruct *ptr=&s;   //指针的类型为MyStruct *,指向的类型是MyStruct。
 //声明了一个指向结构对象s  的指针。
int *pstr=(int*)&s;  //pstr 和它被指向的类型ptr 是不同的

 访问结构体:
 (1)通过指针ptr 来访问s的成员变量:
 ptr->a; //->为指向运算符,
 ptr->b; //其实也通过(*ptr).b;来访问的。但一般还是用“->”。
 ptr->c;
 (2)通过指针pstr 来访问s 的成员变量:
*pstr; //访问了s  的成员a。
*(pstr+1); //访问了s 的成员b。
*(pstr+2) //访问了s  的成员c。
其实使用pstr 来访问结构成员是不正规的。
正确的做法是将结构体换成数组通过指针来访问数组的各个单元。
但指针访问结构成员的正确方法应该是使用指针ptr 的方法。

三、指针与函数的关系

可以把一个指针声明成为一个指向函数的指针。

来个简单而又经典的例子先:

int foo(char *,int);
int (*pfoo)(char *,int);
pfun1=foo;
int a=(*pfoo)("hihihi",6); //通过函数指针调用函数。
可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来
作为实参。

再来个比较本质的例子:

int fun(char *);  
//函数的功能统计一个字符串中各个字符的ASCII 码值之和
int a;
char str[]="caijinlong";
a=fun(str);
int fun(char *s)
{
   int number=0;
   for(int i=0;;)
    {
      number+=*s;
      s++;
    }
  return number;
}

【解析】:(还是让读者自己试一试)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容