C语言指针初见(一)
2015-10-27 20:56
363 查看
最近一直在学习C语言指针,一直想总结一下,终于腾出来时间了,如果有写错的地方希望大家多多指正!
一个变量的地址称为该变量的“指针”。
如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。
指针变量就是地址变量,用来存放地址,指针变量的值是地址(即指针)。
定义一个整型变量int a;,定义一个指向变量a的指针变量int *p = a; 或int *p; p = &a;。此时p指向a,a的地址赋给指针变量p,而不是*p(即变量a)。*p 表示变量a。
定义指针变量:类型名 *指针变量名;
一个变量的指针的含义包括两个方面,一是以存储单元编号表示的地址(如编号为2000的字节),一是它指向的存储单元的数据类型(如int,char,float等)。
不能通过执行调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值。
通过指针引用一维数组(整型):
若有整型一维数组:int a[10];
定义指针变量:int *p; p = a;(或p = &a[0])
一维数组名a不能代表整个数组,它代表的是数组首元素的地址,即此时是将数组首元素的地址赋给p。
在进行运算时“p++”代表指向下一个元素。(p++并不是单纯的加1,而是增加它所指向的数据类型所占的字节大小)
此时有p+i==&a[i]。*(p+i)==a[i]。
通过指针引用二维数组(整型):
若有二维数组:int a[10][10];
定义指针变量:int *p;
二维数组名a代表二维数组首元素的地址,现在的首元素不是一个简单的整型元素,而是由10个整型元素所组成的一维数组,因为a代表的是首行(即序号为0的行)的首地址。
二维数组里啊a[0],a[1],a[2]的类型为int *型。
因此可以定义p=a[0];则p++依次指向a[1]---a[99]。*p输出p指向的元素的值。
定义指向一维整型数组的指针变量:int (*q)[10]; q为指针变量,它指向包含10个元素的一维数组。q的基类型是一维数组。
对于二维数组:
(1)a二维数组名,指向一维数组a[0],即0行首地址。
(2)a[0] ,*(a+0),*a0行0列首地址。
(3)a+1,&a[1]1行首地址。
(4)a[1],*(a+1)1行0列元素a[1][0]的地址。
(5)a[1]+2,*(a+1)+2,&a[1][2]1行2列元素a[1][2]的地址。
(6)*(a[1]+2),*(*(a+1)+2),a[1][2]1行2列元素a[1][2]的值。
a[0],a[1],a[2]既然是一维数组名,而C语言又规定数组名代表数组元素的首地址,因此a[0]代表一维数组a[0]中第0列元素的地址,即&a[0][0]。也就是说a[1]的值是&a[1][0],a[2]的值是&a[2][0]。
二维数组名是指向行的,因此a+1中的"1"代表一行中全部元素的字节数。
一维数组名是指向列的,因此a[0]+1中的"1"代表一个a元素所占的字节数。
指向行的指针前面加上*,就变为指向列的指针。
指向列的指针前面加上&,就变为指向行的指针。
&a[i]和a[i]的值是一样的,但是含义不同。
&a[i]或a+i指向行。
*(a+i)或a[i]指向列。
当下标j为0时,它们的值相同,即它们代表同一地址,但是它们所指的对象是不同的,即指针的基类型不同。
通过指针引用字符串
char a[10];或char *a; a = (char *)malloc(10);
char *p = a;
此时p指向字符串a的第一个字符。
通过字符数组名能输出整个字符串,但不同通过整型数组名输出数组中所有元素。
可以通过字符指针变量输出整个字符串。
C语言中只有字符变量,没有字符串变量。
编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元。
字符指针变量的值可以改变,而数组名代表一个固定的值(数组元素首地址),不能改变。
字符数组中各元素的值是可以改变的,而字符指针变量指向的字符串常量的值是不能改变的。
指针数组: 类型名 *数组名[数组长度]。
char *s[3] = {" aa "," ccc "," nnn "};
int *a[3];数组中的元素存放的是地址。
指针数组比较适合用来指向若干个字符串,使字符串的处理更加灵活。
数组中s[0]用来存放字符串“aa”的首地址。
指向指针数据的指针:
char **p; (p=地址,*p=值。)
int **q; (q=地址,**q=值。)
*运算符的结合性是从右到左,因此**p相当于*(*p)。
后面的*p表示p是指针变量,前面的char*表示p指向char*(或int*)型数据。
一个变量的地址称为该变量的“指针”。
如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。
指针变量就是地址变量,用来存放地址,指针变量的值是地址(即指针)。
定义一个整型变量int a;,定义一个指向变量a的指针变量int *p = a; 或int *p; p = &a;。此时p指向a,a的地址赋给指针变量p,而不是*p(即变量a)。*p 表示变量a。
定义指针变量:类型名 *指针变量名;
一个变量的指针的含义包括两个方面,一是以存储单元编号表示的地址(如编号为2000的字节),一是它指向的存储单元的数据类型(如int,char,float等)。
不能通过执行调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值。
通过指针引用一维数组(整型):
若有整型一维数组:int a[10];
定义指针变量:int *p; p = a;(或p = &a[0])
一维数组名a不能代表整个数组,它代表的是数组首元素的地址,即此时是将数组首元素的地址赋给p。
在进行运算时“p++”代表指向下一个元素。(p++并不是单纯的加1,而是增加它所指向的数据类型所占的字节大小)
此时有p+i==&a[i]。*(p+i)==a[i]。
通过指针引用二维数组(整型):
若有二维数组:int a[10][10];
定义指针变量:int *p;
二维数组名a代表二维数组首元素的地址,现在的首元素不是一个简单的整型元素,而是由10个整型元素所组成的一维数组,因为a代表的是首行(即序号为0的行)的首地址。
二维数组里啊a[0],a[1],a[2]的类型为int *型。
因此可以定义p=a[0];则p++依次指向a[1]---a[99]。*p输出p指向的元素的值。
定义指向一维整型数组的指针变量:int (*q)[10]; q为指针变量,它指向包含10个元素的一维数组。q的基类型是一维数组。
对于二维数组:
(1)a二维数组名,指向一维数组a[0],即0行首地址。
(2)a[0] ,*(a+0),*a0行0列首地址。
(3)a+1,&a[1]1行首地址。
(4)a[1],*(a+1)1行0列元素a[1][0]的地址。
(5)a[1]+2,*(a+1)+2,&a[1][2]1行2列元素a[1][2]的地址。
(6)*(a[1]+2),*(*(a+1)+2),a[1][2]1行2列元素a[1][2]的值。
a[0],a[1],a[2]既然是一维数组名,而C语言又规定数组名代表数组元素的首地址,因此a[0]代表一维数组a[0]中第0列元素的地址,即&a[0][0]。也就是说a[1]的值是&a[1][0],a[2]的值是&a[2][0]。
二维数组名是指向行的,因此a+1中的"1"代表一行中全部元素的字节数。
一维数组名是指向列的,因此a[0]+1中的"1"代表一个a元素所占的字节数。
指向行的指针前面加上*,就变为指向列的指针。
指向列的指针前面加上&,就变为指向行的指针。
&a[i]和a[i]的值是一样的,但是含义不同。
&a[i]或a+i指向行。
*(a+i)或a[i]指向列。
当下标j为0时,它们的值相同,即它们代表同一地址,但是它们所指的对象是不同的,即指针的基类型不同。
通过指针引用字符串
char a[10];或char *a; a = (char *)malloc(10);
char *p = a;
此时p指向字符串a的第一个字符。
通过字符数组名能输出整个字符串,但不同通过整型数组名输出数组中所有元素。
可以通过字符指针变量输出整个字符串。
C语言中只有字符变量,没有字符串变量。
编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元。
字符指针变量的值可以改变,而数组名代表一个固定的值(数组元素首地址),不能改变。
字符数组中各元素的值是可以改变的,而字符指针变量指向的字符串常量的值是不能改变的。
指针数组: 类型名 *数组名[数组长度]。
char *s[3] = {" aa "," ccc "," nnn "};
int *a[3];数组中的元素存放的是地址。
指针数组比较适合用来指向若干个字符串,使字符串的处理更加灵活。
数组中s[0]用来存放字符串“aa”的首地址。
指向指针数据的指针:
char **p; (p=地址,*p=值。)
int **q; (q=地址,**q=值。)
*运算符的结合性是从右到左,因此**p相当于*(*p)。
后面的*p表示p是指针变量,前面的char*表示p指向char*(或int*)型数据。
相关文章推荐
- C语言 - 快速排序算法
- C++知识点总结
- C++ 命令模式
- 利用c语言计算n的阶乘及其求和(多种方法)
- C语言 - 直接插入排序和直接选择排序算法
- C语言 - 冒泡排序算法(交换排序) 从大到小
- VC C++ 线程同步的方法
- 关于C++中的前置声明
- C语言内存布局
- 杭电ACM2016-数据的交换输出
- UE4 C++使用Multi Theard的教程
- C语言实验——Hello World!(printf练习)
- C语言程序入门第一节课/3
- C++邻接矩阵创建图及深度、广度遍历
- 合并两个排序链表(LintCode)
- 利用c语言求出0~999之间的所有“水仙花数”并输出
- 用c语言输出菱形(13行)
- BZOJ1083繁忙的都市
- c语言小程序:编写猜字游戏
- 用c语言模拟用户登录,并且只能登录三次