C语言:2026.1.16
1.内存和地址:
4G:2^32个地址编号
地址的表现形式是十六进制;
2.指针:某一个内存单元的编号,就是指针;
如果知道了某一个变量的地址,知道了地址就可以对变量进行操作;
&取地址运算符;(8位16进制数)
3.冯诺依曼体系
输入 运算器 输出
存储器
控制器
4.p表示p是一个指针变量;
int p;表示是一个int类型;
5.指针变量类型的理解:
不同类型的地址需要不同类型的指针变量;
6.解引用操作符
通过pa这个指针变量中的地址,找到对应内存单元,找到数据;
可以引用,也可以赋值;pa=a;
char解引用访问一个字节
int解引用访问四个字节
指针变量可以访问的字节数取决于指针变量的类型;
指针的大小和类型无关,与操作系统有关;
指针变量的类型可以决定在解引用中访问的字节数;
7.保证指针变量的类型和数据类型对应起来,
数据的范围要大于指针引用范围;
8. 指针变量的类型决定了+1 -1跳过的字节数,
9.通过指针可以访问数组,(p+i)
10.通过指针计算字符串长度int len=strlen(str),长度不包括\0;
11.char str 不能修改;
12.指针相减,两元素间个数
指针-指针得到元素个数;
13.void指针:不能进行指针的加减和解引用,但可以接收任意指针类型变量;
14.大小端存储:
小:低存低
大:低存高
15.coast位置
1.左,表示指针指向的内存空间中的内容不能修改; p不能修改
2.右,指针变量当中的内容不能修改; p不能修改
3.左右,1.2都满足;
作业:
1.指针,地址,指针变量的关系:
1. 地址:内存单元的编号,是数据在内存中的唯一标识。
2. 指针:本质就是地址,是一个内存编号的别名。
3. 指针变量:专门用来存储指针(地址) 的变量,其值是另一个变量的内存地址。
一句话总结
指针变量是存放指针(地址)的容器,指针就是地址,三者是“容器-内容-本质”的关系。
2.指针类型的意义,解引用,+1 -1:
解引用操作符*
通过pa这个指针变量中的地址,找到对应内存单元,找到数据;
可以引用,也可以赋值;pa=a;
char解引用访问一个字节
int解引用访问四个字节
指针变量可以访问的字节数取决于指针变量的类型;
指针的大小和类型无关,与操作系统有关;
指针变量的类型可以决定在解引用中访问的字节数;
保证指针变量的类型和数据类型对应起来,
数据的范围要大于指针引用范围;
指针变量的类型决定了+1 -1跳过的字节数,
3.指针的大小:
所以指针变量的大小是和地址的大小相关
32位平台下,地址是32个比特位,也就是4个字节
64位平台下,地址是64个比特位,也就是8个字节
4.指针和指针相减,指针和指针比较:
(1)
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++)
{
printf("%d ", (p + i));
}
return 0;
}
(2)
int myStrlen(char s)
{
char* p = s;
while (*p != '\0')
{
p++;
}
return p - s;
}
int main()
{
char* str = "12345";
printf("%d", myStrlen(str));
}
(3)
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
while (p < arr + sz)
{
printf("%d ", p);
p++;
}
return 0;
}
5.const修饰指针功能:
coast位置
1.左,表示指针指向的内存空间中的内容不能修改; p不能修改
2.右,指针变量当中的内容不能修改; p不能修改
3.*左右,1.2都满足;
6.大小端存储:
- 大端存储:数据的高位字节存放在内存的低地址处,低位字节存放在高地址处。
- 小端存储:数据的低位字节存放在内存的低地址处,高位字节存放在高地址处。
判断:
int main()
{
int a = 0x11223344;
char* p =(char) & a;
if (p == 0x44)
{
printf("小端");
}
else {
printf("大端");
}
}
浙公网安备 33010602011771号