- 指针是能存放一个地址的一组存储单元(通常是2-4个字节)。
char
型变量是8bit,int
型变量是4*8bit。
char
型指针和int
型指针,指针变量本身都是占4个字节的内存空间,存放的都是一个32位的地址。不同点在于char
类型指针和int
类型指针在做算术运算的时候地址值的变化是不一样的。
- 指针只能指向某种特定类型的对象,也就是说,每个指针都必须指向某种特定的数据类型。
- 由于C语言是以传值的方式将参数值传递给被调用函数的,因此被调用函数不能直接修改主调函数中变量的值。
void swap(int x,int y)
{
int temo;
temp = x;
x = y;
y = temp;
}
- 但,我们可以使主调程序将指向所要交换的变量的指针传递给被调用函数
swap(&a,&b)
- 通过这些指针来间接访问他们指向的被操作数。
void swap(int *px,int *py)//交换*px与*py
{
int temo;
temp = *px;
*px = *py;
*py = temp;
} //在调用时使用`swap(&a,&b)`,传进来两个指针就行。
- 下标和指针之间有着密切的关系。根据定义,数组类型的变量或表达式的值是该数组第0个元素的地址。执行赋值语句
pa = &a[0]
后,pa和a具有同样的值。因为数组名所代表的就是该数组最开始的一个元素地址,所以,赋值语句pa = &a[0]
可以写成下列形式
pa = a
对数组元素a[i]
的引用也可以写成*(a+i)
这种形式。
- 相应的,如果pa是一个指针,那么,在表达式中也可以在他的后面加下标。
pa[i]
与*(pa+i)
是等价的。
- 当把数组名传递给一个函数时,实际上传递的是该数组的第一个元素的地址。
在被调用函数中,该参数是一个局部变量。
在对该变量进行操作时(例如自加),不会影响到该函数调用者中的字符串。因为它仅对该指针在函数中的私有副本进行自加运算。
- 在函数定义中,形式参数
char s[]
与
char *s
是等价的。
- 同时,也可以将子数组的起始位置的指针传递给函数,这样就将数组的一部分传递给了函数。
- 指针可以和证书进行相加或相减运算。例如,结构
p + n
表示指针p当前指向的对象之后第n个对象的地址。在计算p+n时,n将根据p指向的对象的长度按比例进行缩放。例如,如果int类型占4个字节的存储空间,那么在int类型的计算中,对应的n将按照4的倍数来计算。
- 以下两段代码等价
int strlen(char *s){
char *p = s;
......
}
等价于int strlen(char *s){
char *p;
p = s;
......
}
char *p = s;
与上述两段等价。
- printf接收的是一个指向字符数组第一个字符的指针。也就是说,字符串常量可以通过一个指向其第一个元素的指针访问。
- 一个需要小小注意一下的点
char amessage[] = "now is the time";
char *pmessage = "now is the time";
这两句是不一样的。pmessage无法对数组元素进行修改?“如果试图修改字符串的内容,结果是没有定义的”
- 指针数组
对指针数组进行初始化,完成后数组的每个元素为各个字符串首地址。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步