AutoLeaders控制组——C语言指针的学习笔记
目录
在C 语言中,指针是一种派生数据类型。它是从 C语言的一种基本数据类型创建而来的。指针以内存地址作为其值。由于内存地址表示在计算机内存中保存程序指令和数据的位置,因而可用指针来直接访问和操作存储在内存中的数据。
毫无疑问,指针是C语言最显著最令人兴奋的特征之一。它为C语言增加了强大的功能和灵活性。尽管对初学者来说,指针有点令人迷惑,难以理解,但是,一旦掌握,它就是一个功能强大的工具,很好使用。
在C语言中,指针使用很频繁,具备很多优点,具体包括:
(1) 在处理数据和数据表时,指针更高效。
(2)通过作为函数参数,指针可用水从西数中返回多个值。
(3)指针允许引用函数,因而便于把函数作为参数传递给其他函数。
(4)使用指向宇符串的指针数组,可节省内存的数据存储空间。
(5)指针使得C 语言支持动态内存管理。
(6)指针为操作动态数据结构 (如结构、链表、队列、栈和树等)提供了 有效的工具。
(7)指针可减少程序的长厦,降低其复杂度。
(8)指针可提供程序的运行速度,从而诚少程序的运仃时间。
P=&x //把变量x的地址赋值给指针变量p
Int *p //定义了一个整型指针(指向的变量的数据类型为整型)
注:未初始化的指针的值是未知的,他们可能指向错误的值。
几种初始化指针的方式
- int *p;p=&变量;
- Int *p=&变量;
- Int x,*p=x;
- Int *p=NULL或 0;
n=*p //把p指向的变量的值赋给n
*p=1 //把1赋给p指向的变量
Int x,*p1,**p2;p1=&x;p2=&p1; //p2表示指向p1指针的指针
C允许对指针和整数进行加减运算,指针和指针间进行减法运算
如:p+4,p-2,p1-p2
也可以用快捷运算符
P++,-p,sum+=*p
我们知道,指针可以如下进行递增:
P1=p2+2
P1=p1+1
但需要记住的是,下面表达式:
P1++
表示是指针 p1 指向其类型的下一个值。例如,如果 p1 为整型指针,其初始值为 2800,那么经过 p1=p1+1运算后,p1的值为 2802,而不是 2801。也就是说,当指针进行递增时。所士加的值为该指针指向的数据炎型的“长度’这种长度就称为比例因于(scale factor)。
对 IBMPC 机而言,不同数据类型的长度如下:
字符1字节
整数2字节
浮点数4字节
长整数4子节
双精度数8字节
用来存储不同数据类型的字节数取决于具体的系统,且可以使用 sizeof 运算符来得到。
例如,如果x 为变量,那么sizeof(x)返回的是存储该变量所需的宇节数(奔腾机使用 4个字节来存储整数,使用2个字节来存储短整数)。
当对指针变量执行运算时,将应用以下规则:
(1)可以把另一个变量的地址赋给指针变量。
(2)可以把一个指针变量的值赋给另一个指针变量。
(3)可以使用 NULL 或零值来初始化指针变量。
(4)可以在指针变量的前面或后面添加递增或递减运算符。
(5)指针变量可以与整数值进行加减运算。
(6)当两个指针指向同一个数组时,可以用一个指针变量减去另一个指针变量。
(7)当两个指针指向相同数据类型的对象时,可以使用关系运算符对它们进行比较
操作。
(8)不能把指针变量与常量做乘法运算。
(9)两个指针变量不能做加法运算。
(10)不能把一个数值赋给地址(例如,&x=10是非法的)。
1.指针与数组
p=x等价于p=&x[0];
p+1=&x[1];
(1)用p++的性质来访问数组
(2)用p1-p2来计算数组部分长度
(3)用指针和数组最后一个元素进行比较,以确定是否遍历完该数组
二维数组:
*(*(p+i)+j)=a[i][j]
*(p+列数*i+j)=a[i][j]
用指针定义数组:char *str =”good”;
这样指针指向”g”
输出:printf(“%S”,string1) 或 puts(string1)
在c中常量字符串总是表示指向字符串的指针
因此,这是合法的:
char *name;name=”Henry”;
用来处理字符串表
例:
Char *name[3]={
“New Zealand”,
“Australia”,
“India”,
};
当把地址传递给函数时,接收该地址的参数必须是指针。使用指针传递变量地址的函数调用过程称为“引用函数调用”(传递变量实际值的过程称为“以值调用”)。
按引用调用的函数可以修改在调用中所使用的变量的值。
(1) 函数的参数声明为指针。
(2) 在函数体中使用了间接引用指针。
(3) 当调用函数时,地址作为实参做传递。
利用变量名,函数可以返回一个值,通过指针变量可以返回多个值。由于指针是C 的一种数值类型,我们也可以使函数返回一个指向调用函数的指针
注意,所返回的地址必须是调用函数中的变量的地址。如果返回的是指向被调用函数中的局部变量的地址,将产生错误。
放在结构体吧