C语言指针学习笔记——控制组

一.指针

1.运算符

1. 运算符&
获得变量的地址。多用于scanf语句中访问某一变量地址,对其赋值。
想要输出某变量的地址时,则以printf(“%p”,&变量名称);的形式输出。
视频中提到 在32位架构下int和地址的size都是4个字节 所以如果通过强制类型转换的方式来将某变量的地址赋给另一个变量然后再以十六进制输出 所得结果与原变量的地址相同;
而在64位架构下则占8个字节,这取决于编译器或编译配置。

2.地址

2.地址:
单一变量:
定义时相邻的变量比如i,p等,其地址也是相邻的,地址相差四个字节一个变量类型(如int=4)的大小 注:定义时的顺序也决定了变量地址的高低,顺序越靠前,地址越高。
数组:#include<stdio.h>
int main(){
int a[10]; printf("%p/n",&a): printf("%p/n",a): printf("%p/n",&a[0]): printf("%p/n",&a[1]): }
以上代码所得结果依次为:0x…44;0x…44;0x…44;0x…48。可知数组的首地址与数组中第一个单元的地址相同,且&a==a,也可说明数组是一种特殊的指针。
即 上述 (pb+1) 可写成 pb[1]

3.指针变量与取值运算符

3.指针变量与取值运算符:
指针的定义:设一变量为a,另一为p。令 p 中存储 a 的首地址,则 p 为 a 的指针,p 指向 a .
包含指针的各种形式的意义:
p/pa:代表 目标数据对象的首地址,即a 的首地址。
*pa:代表通过指针变量 p 去访问 a ,值为 a 的值,可以对其赋值也可以利用其值。

4.指针的强制类型转换

4.指针的强制类型转换:
类型的转换,会使指针的首地址和存储空间随之改变。

int n = 0;
int *p = &n;
char *p1=(char*)p;
printf("%p/n",p);
printf("%p/n",p1);
printf("%d/n",*p);
printf("%d/n",*p1);

当n的初始值在0~127之间时,printf的值两两相同,而当n的值大于127 即 超过了char类型所能表达的数值范围时,*p1就会变得“不可理喻”。

5.指针访问与下标访问等价

*指针[下标] = (指针 + 偏移量)

二.指针运算

1.指针类型与整型加减

指针加减n后首地址将向前或向后移动n步长个字节,步长为sizeof(目标数据对象)。即sizeof(目标数据对象的类型)。
`#include <stdio.h>
int main()
{
char
pc = (char*)100;
int* pn = (int*)100;
int* ps = (int*)100;

pc = pc + 1;
pn = pn + 1;
ps = ps - 1;

printf("pc=%u",pc);
printf("pn=%u",pn);
printf("ps=%u",ps);

return 0;

}`

2.同类型指针减法运算

两指针类型相减,所得结果为两首地址之差除以步长。
`#include <stdio.h>
int main()
{
int* pn = (int*)100;
int* pc = (int*)120;

printf("%d",pc-pn);
return 0;

}`
结果为:5.(20/sizeof(int))

三.多级指针

先看代码

#include <stdio.h>
int main()
{
    int n = 100;
    int* one = &n;
    int** two = &one;
    int*** three = &two;
    int**** four = &three;
    int***** five = &four;
    
    printf("%d",*****five);
    return 0;
}

可以通过分布运算来弄清多级指针。每个指针变量与一个进行运算,成为所指向的变量的值,当所指向变量是另一个指针变量时,所剩的便可重复上述步骤,故每个指针所指向的是它的上一层,而非最终的n。

四.指针与数组

1.在定义函数时 若输入中有数组 则输入时的a[]就相当于一个指针,在函数中去计算a[]的size也会发现其只有一个单位的大小(即使在main中已经赋了多个值)
2.数组变量本身表达地址,所以 int a[10];int p = a; //无须加&取地址符。但是每个数组单元表达的是变量 需要&。
3.[]可以对数组做 也可以对指针做,即:a[]==p[]。
4.运算符可以对指针做,也可以对数组做,如a=5。
使用指针访问数组等价于下标访问
a. 中括号 [ ] ,被称作下标运算符,它的优先级高于一切其他运算符。
b. 数组名[下标] 等价于 (数组名 + 偏移量)
​ 例如: a[1] == (a+1)
5.数组变量是const的指针,所以不能被直接赋值。即不能int b=a[]; 不能让一个数组直接等于另一个数组 自然也不能将这个作为判断条件去用。

五.指针与函数

1.一段函数代码所分配的储存空间的首地址叫做这段函数的地址,且函数名表示的就是这个地址
2.格式:函数返回值类型(指针变量名)(函数参数列表);
使用前 先让指针变量等于函数名,代表此指针变量指向该函数
之后直接(指针变量)(参数)即可 作用等同于 函数名(参数)
3。指针的一大重要作用
在不同的块之间传输数据。

六.const

当intconst q=&i;时const修饰的是q变量 意义为q只能为i的地址,q只能指向i为i的值,q无法再改变。
当const int q=&i;时,const形容的是q这个整体,意义为q所代表的值不能通过对*q赋值来改变。但是q本身可以再改变(比如让q=&k)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值