前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

指针

作者头像
编程范 源代码公司
发布2018-04-16 12:03:30
5660
发布2018-04-16 12:03:30
举报

1、地址与指针

Hi,欢迎来到指针的世界,也许您早已听过它的大名,指针被称为是C语言的精华所在。真正理解和掌握指针是征服C语言的关键所在! 在众多的计算机语言中,试问:还有哪门语言可以有C语言这样在作用、速度和安全上平衡的如此优异的呢?而指针则在其中扮演了重要的角色!或许有人会说:正是因为指针才使C程序变得非常不安全!而我则想说的是:这就要求C程序员要有更高的驾驭C语言的能力,而这点也恰好反映出C的设计哲学!那就是:“C充分相信程序员!” 所以:请不要辜负她! OK,在学习指针之前,我们先弄清楚一个概念:

地址

何谓地址?在内存(注意,我们这里提到的内存并不是人们常说的计算机的物理内存,而是虚拟的逻辑内存空间)当中,简单点说:地址就是可以唯一标识某一点的一个编号,即一个数字!我们都见过尺子,我们统一以毫米为单位,一把长1000毫米的尺子,其范围区间为0~999,而我们可以准确的找到35毫米、256毫米处的位置。同样的道理,内存也如此,也是像尺子一样线性排布,只不过这个范围略大,在我们最广泛使用的32位操作系统下,是从0~4,294,967,295之间,而地址就是这之中的的一个编号而已,习惯上,在计算机里地址我们常常用其对应的十六进制数来表示,比如0x12ff7c这样。在我们的C程序中,每一个定义的变量,在内存中都占有一个内存单元,比如int类型占四个字节,char类型占一个字节等等,每个字节都在0~4,294,967,295之间都有一个对应的编号,C语言允许在程序中使用变量的地址,并可以通过地址运算符"&"得到变量的地址。

代码语言:javascript
复制
#include<stdio.h>
int main()
{ 
int i; 
int a[10]={1,2,3,4,5,6,7,8,9,0}; 
char b[10]={'c','l','a','n','g','u','a','g','e'}; 
for(i=0;i<10;i++) 
{ 
  printf("int Address:0x%x,Value:%d\n",&a[i],a[i]); 
} 
printf("\n"); 
for(i=0;i<10;i++) 
{ 
  printf("char Address:0x%x,Value :%c\n",&b[i],b[i]); 
} 
return 0;
}

在32位linux系统下运行参考结果:

代码语言:javascript
复制
int Address:0xbfb949c4,Value:1
int Address:0xbfb949c8,Value:2
int Address:0xbfb949cc,Value:3
int Address:0xbfb949d0,Value:4
int Address:0xbfb949d4,Value:5
int Address:0xbfb949d8,Value:6
int Address:0xbfb949dc,Value:7
int Address:0xbfb949e0,Value:8
int Address:0xbfb949e4,Value:9
int Address:0xbfb949e8,Value:0
char Address:0xbfb949f2,Value :c
char Address:0xbfb949f3,Value :l
char Address:0xbfb949f4,Value :a
char Address:0xbfb949f5,Value :n
char Address:0xbfb949f6,Value :g
char Address:0xbfb949f7,Value :u
char Address:0xbfb949f8,Value :a
char Address:0xbfb949f9,Value :g
char Address:0xbfb949fa,Value :e
char Address:0xbfb949fb,Value :

请亲自上机运行测试,并观察分析结果。

2、指针的定义和使用

指针

明白地址的概念之后,指针也就不奇怪了。简单的讲,地址就是逻辑内存上的编号,而指针虽然也表示一个编号,也是一个地址。但两者性质却不相同。一个代表了常量,另一个则是变量。就好比内存是一把尺子,而指针就是尺子上面的游标,可以左右移动,他某一个时刻是指向一个地方的,这就是指针变量。 对指针变量定义的一般形式为: 类型说明符 *变量名; 其中,这里的*与前面的类型说明符共同说明这是一个指针变量,类型说明符表示该指针变量所指向的变量为何种数据类型,变量名即为定义的指针变量名。除此之外,C还提供*运算符获取地址上对应的值。 例如:

代码语言:javascript
复制
#include<stdio.h>
int main()
{
  int num=2014;
  int *p=&num;
  printf("num Address = 0x%x,num=%d\n",&num,num);
  printf("p = 0x%x,*p=%d\n",p,*p);
  printf("%d\n",*&num);
  return 0;
}

请亲自运行观察结果并思考。 值得一提的是,由于指针存放的都是地址,在32位操作系统下都在0 ~ 4,294,967,295这个数区间内,所以:在32位操作系统下,任何类型的指针变量都占四个字节!

代码语言:javascript
复制
#include<stdio.h>
struct INFO
{
  int a;
  char b;
  double c;
};
int main()
{
  int *p;
  char *p1;
  float *p2;
  double *p3;
  struct INFO *p4; //struct INFO类型为结构体类型 我们将会在后面的章节中讲解
  void *p5;
  printf("int point size is :%d\n",sizeof(p));
  printf("char point size is :%d\n",sizeof(p1));
  printf("float point size is :%d\n",sizeof(p2));
  printf("double point size is :%d\n",sizeof(p3));
  printf("struct point size is :%d\n",sizeof(p4));
  printf("void point size is :%d\n",sizeof(p5));
  return 0;
}

请您亲自上机运行并观察结果。 

3、数组与指针

前面我们已经知道,通过数组下标可以确定数组元素在数组中的顺序和存储地址。由于每个数组元素 相当于一个变量,因此指针变量可以指向数组中的元素,也就是说可以用指针方式访问数组中的元素。 对一个指向数组元素的指针变量的定义和赋值方法,与指针变量相同。例如:

int a[10]; /*定义 a 为包含 10 个整型数据的数组*/

int *p; /*定义 p 为指向整型变量的指针*/

p=&a[0]; /*把 a[0]元素的地址赋给指针变量 p*/

C 语言规定,数组名代表数组的首地址,也就是第 0 号元素的地址。因此:

p=a; /*等价于 p=&a[0]; */

int *p=a; /*等价于 int *p=&a[0]; */

对于指向首地址的指针 p,p+i(或a+i)就是数组元素 a[i]的地址,*(p+i)( 或*(a+i) )就是 a[i]的值。 如果指针变量 p 已指向数组中的某一个元素,则 p+1 指向同一数组中的下一个元素。 引入指针变量后,就可以用以下两种方法来访问数组元素: (1)下标法,即用 a[i]形式访问数组元素,在前面介绍数组时都是采用这种方法。 (2)指针法,即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中 a 是数组名,p 是 指向数组的指针变量,其初值 p=a。

代码语言:javascript
复制
#include<stdio.h>
int main()
{
  int i;
  int a[10]={1,2,3,4,5,6,7,8,9,0};
  int *p=a; 
  for(i=0;i<10;i++)
  {
    printf("P Value:%d   a Value :%d\n",*(p++),*(a+i));
  } 
  printf("\n");
  return 0; 
}

注意输出的两种方式,指针可以通过++或--并修改自身值的方式移动,然而数组名本身值不可以被更改。 请您亲自上机运行,并分析。

4、字符串与指针

前面我们已经讨论过字符数组与字符串,字符指针也可以指向一个字符串,可以用字符串常量对字符 指针进行初始化。例如:

char *str = "www.clang.cc" ;

这是对字符指针进行初始化。此时,字符指针指向一个字符串常量的首地址。 还可以用字符数组来存放字符串,例如:

char string[ ] = "Welcome to clang.cc";

在这个语句中,string 是数组名,代表字符数组的首地址。因此可以通过数组名 string 来访问字符串。 字符串指针和字符串数组两种方式都可以访问字符串,但它们有着本质的区别:字符指针 str 是个变量,可以改变 str 使它指向不同的字符串, 但不能改变 str 所指向的字符串常量的值。 而string 是一个数组,可以改变数组中保存的内容。应注意字符串指针和字符串数组的区别。

代码语言:javascript
复制
#include<stdio.h>
int main()
{
  char *str = "www.clang.cc";
  char string[]="Welcome to clang.cc";
  str[0]='C'; //试图修改str指向的常量区的字符串内容
  return 0;
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程范 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、地址与指针
    • 地址
    • 2、指针的定义和使用
      • 指针
      • 3、数组与指针
      • 4、字符串与指针
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档