什么是指针?
2012-05-05 16:48
417 查看
如果在程序中定义了一个变量,在对程序进行编译时,
系统会根据程序中定义的变量类型,分配一定长度的空间。
例如,Visral C++为整形变量分配4个字节,
对单精度浮点型变量分配4个字节,
对字符变量分配1个字节。
内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。
在地址所标志的内存单元中存放的数据则相当于旅馆房间中居住的旅客。
由于通过指针能找到所需的变量单元,可以说,“地址指向该变量单元”。
由于地址能够指向该变量单元,故形象的将“地址”称为“指针”。
意思是通过它能够找到以它为地址的内存单元。
int *i_pointer;
指针变量名 指针变量内容
i_pointer *i_pointer
2000 3
上面的2000是地址,3是地址中内容。
在定义指针变量时一定要声明类型,为什么呢?
如果想通过指针引用一个变量,只知道地址(2000)是不够的,
因为无法判定是从地址为2000的一个字节中取出一个字符数据,
还是从2000和2001两个字节取出short型数据,还是从2000
到2003四个字节中取出int或者float型数据。
函数参数也可以是指针类型,
它的作用是将一个变量的地址传送到另一个函数中。
通过指针引用数组和字符串》》》》》》》》》》》》》
通过指针引用数组元素。
(1)下标法, a[i];
(2)指针法,*(a+i) 或 *(p+i)。其中p=a;
那么现在的p就指向了数组a的首地址。
通过指针引用字符串
(1)char string[]="I Love You";
(2)char *string="I Love You";
那么现在string指针就指向了"I Love You"的第一个字符的首地址。
指针数组》》》》》》》》》》》》》》》》》》》》
由于[]比*的优先级要高,因此,在定义数组指针的时候
我们要写成int (*p)[10];
而不能写成int *p[10];
这是指针数组的定义,那么它有什么用呢?
指针数组比较适合用来指向若干个字符串,
使字符串处理更加方便灵活。例如:
图书馆有一些书,想把这些书的书名存入起来
以便于查找和排序。
按一般的方法字符串本身就是一个字符数组。因此
我要设计一个二维的字符数组才能存放多个字符串。
但是在定义二维数组时,需要指定列数,也就是说
二维数组中每一行包含的元素个数相等。而实际上
字符串的长度一般是不相等的。如按最长的字符串
来定义列数,则会浪费许多内存单元。
char *name[]={"Follow me", "BASIC", "Great Wall"};
那么name[0]指针就指向了“Follow me”的第一字符的地址。
同样的道理……
多重指针》》》》》》》》》》》》》》》》》》》》
char *p
p >> string; 也就是说p地址直接指向字符串。
char **p;
(p = 某个地址) >> string;也就是说p地址指向的是存入string串的地址。
系统会根据程序中定义的变量类型,分配一定长度的空间。
例如,Visral C++为整形变量分配4个字节,
对单精度浮点型变量分配4个字节,
对字符变量分配1个字节。
内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。
在地址所标志的内存单元中存放的数据则相当于旅馆房间中居住的旅客。
由于通过指针能找到所需的变量单元,可以说,“地址指向该变量单元”。
由于地址能够指向该变量单元,故形象的将“地址”称为“指针”。
意思是通过它能够找到以它为地址的内存单元。
int *i_pointer;
指针变量名 指针变量内容
i_pointer *i_pointer
2000 3
上面的2000是地址,3是地址中内容。
在定义指针变量时一定要声明类型,为什么呢?
如果想通过指针引用一个变量,只知道地址(2000)是不够的,
因为无法判定是从地址为2000的一个字节中取出一个字符数据,
还是从2000和2001两个字节取出short型数据,还是从2000
到2003四个字节中取出int或者float型数据。
函数参数也可以是指针类型,
它的作用是将一个变量的地址传送到另一个函数中。
通过指针引用数组和字符串》》》》》》》》》》》》》
通过指针引用数组元素。
(1)下标法, a[i];
(2)指针法,*(a+i) 或 *(p+i)。其中p=a;
那么现在的p就指向了数组a的首地址。
通过指针引用字符串
(1)char string[]="I Love You";
(2)char *string="I Love You";
那么现在string指针就指向了"I Love You"的第一个字符的首地址。
指针数组》》》》》》》》》》》》》》》》》》》》
由于[]比*的优先级要高,因此,在定义数组指针的时候
我们要写成int (*p)[10];
而不能写成int *p[10];
这是指针数组的定义,那么它有什么用呢?
指针数组比较适合用来指向若干个字符串,
使字符串处理更加方便灵活。例如:
图书馆有一些书,想把这些书的书名存入起来
以便于查找和排序。
按一般的方法字符串本身就是一个字符数组。因此
我要设计一个二维的字符数组才能存放多个字符串。
但是在定义二维数组时,需要指定列数,也就是说
二维数组中每一行包含的元素个数相等。而实际上
字符串的长度一般是不相等的。如按最长的字符串
来定义列数,则会浪费许多内存单元。
char *name[]={"Follow me", "BASIC", "Great Wall"};
那么name[0]指针就指向了“Follow me”的第一字符的地址。
同样的道理……
多重指针》》》》》》》》》》》》》》》》》》》》
char *p
p >> string; 也就是说p地址直接指向字符串。
char **p;
(p = 某个地址) >> string;也就是说p地址指向的是存入string串的地址。
相关文章推荐
- 什么是数组名?----一 指针与数组的区别!(转载)
- java的引用和c++的指针有什么区别
- 什么是智能指针及何时使用IS2120@CSDN.BG57IV3
- C语言“指针”终极论证,到底什么是指针
- 函数指针和成员函数指针有什么不同,反汇编带看清成员函数指针的本尊(gcc@x64平台)
- 什么是野指针
- 野指针和悬垂指针有什么区别?
- C语言4之什么是指针?
- 什么是进程中的指针
- 理解什么是游标,什么是指针
- 二维指针是什么
- 句柄和指针的区别和联系是什么?[英国某著名计算机图形图像公司面试题]
- 指针和引用有什么区别
- 没做过编译器就是被人欺——从一道变态的类型转换题猜编译器的行为(指针直接调用自己的非虚函数,当时是什么类型就是什么,但数据成员仍用自己的)
- 什么是空指针
- 彻底搞定C指针2--指针是什么东西
- 指针什么时候加*什么时候不需用加,分别代表什么含义
- 指针和引用究竟是什么鬼?
- 面试中遇到的问题:一个指针重复释放会出现什么情况
- 64位指针压缩指什么?