指针和数组(上)
专题四:指针和数组(上)。包括以下章节:
- 指针基础
- 数组基础
- 数组与指针分析
- C语言中的字符串
变量回顾
- 变量是一段存储空间的别名,那么访问这段空间必须使用这个别名吗?
int main()
{
int i = 6;
int* p = &i;
//结果:6, BFC1C3BC
printf("%d, %08X\n", i, p);
//通过*运算也可以修改i的值。(相当于i=10)
*p = 10;
//结果:10, BFC1C3BC
printf("%d, %08X\n", i, p);
return 0;
}
指针本质
- 指针在本质上也是一个变量
- 指针需要占用一定的内存空间
- 指针保存的是内存地址的值
- 问题:不同类型的指针占用的内存空间的大小是否相同?
#include<stdio.h>
int main()
{
int* pi;
char* pc;
long* pl;
double* pd;
float* pf;
//打印结果都是8
//64位系统,指针占8个字节;而32位系统,指针变量占用4个字节
//结论:1,因为指针必须有能力保存所有内存地址的值,(同一机器)不同类型的指针占用的内存空间大小相同
//2,因为不同的机器地址总线不同(32位、64位),所以不同机器上指针占用内存空间大小不同
printf("%lu\n", sizeof(pi));
printf("%lu\n", sizeof(pc));
printf("%lu\n", sizeof(pl));
printf("%lu\n", sizeof(pd));
printf("%lu\n", sizeof(pf));
return 0;
}
结果:
*号的意义
- 在指针声明时,*号表示所声明的变量为指针
- 在指针使用时,*号表示取指针所指向的内存空间中的值
- *号类似一把钥匙,通过这把钥匙可以 打开内存,读取内存中的值。
//指针声明:
int i = 0;
int* p = &i;
//取值
int j = *p;
实例分析1-1
1-2.c
#include <stdio.h>
int main()
{
int i;
int* pI;
char* pC;
float* pF;
pI = &i;
*pI = 10;
printf("%0X, %0X, %d\n", (unsigned int)(long)pI, (unsigned int)(long)&i, i);
printf("%lu, %lu, %0X\n", sizeof(int*), sizeof(pI), (unsigned int)(long)&pI);
printf("%lu, %lu, %0X\n", sizeof(char*), sizeof(pC), (unsigned int)(long)&pC);
printf("%lu, %lu, %0X\n", sizeof(float*), sizeof(pF), (unsigned int)(long)&pF);
return 0;
}
结果:
传值调用与传址调用
- 指针是变量,因此她可以作为函数的参数使用
- 当一个函数体内部需要改变函数外部的值,则需要使用指针参数
- 指针适用于复杂数据类型作为参数的函数中
传值调用和传址调用示例
#include<stdio.h>
//传值调用:传形参,不会改变函数外部的值
void f1(int a, int b)
{
a = 2;
b = 3;
}
//传址调用:传内存地址,通过*运算取值,可以改变函数外部的值
void f2(int* pa, int* pb)
{
*pa = 2;
*pb = 3;
}
int main()
{
int a = 0;
int b = 0;
f1(a,b);
printf("%d, %d\n", a, b);//a = 0, b = 0
f2(&a, &b);
printf("%d, %d\n", a, b);//a = 2, b = 3
return 0;
}
手把手教你写代码:利用指针实现变量交换函数
#include<stdio.h>
#define SWAP(a,b) do{ int tmp = a; a = b; b = tmp; }while(0)
void swap1(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
void swap2(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 5;
int b = 8;
swap1(a,b);//不会互换值。在调用函数时,函数自己创建栈变量,与外部a、b没关系
printf("%d, %d\n", a, b);
swap2(*a,*b);
printf("%d, %d\n", a, b);
a = 5;
b = 8;
SWAP(a,b);//会互换值。在预编译期直接替换代码,互换的是我们定义的a和b
printf("%d, %d\n", a, b);
return 0;
}
常量与指针
- const int* p //p可变,p指向的内容不变
- int const* p //p可变,p指向的内容不变
- int* const p//p不变,p指向的内容可变
const int* const p //p和p指向的内容都不可改变
左数右指//const在左边,数据(指针指向的内容)不变;const在右边,指针(p的值)不变
小结
- 指针是C语言中一种特别的变量
- 指针所保存的值是内存的地址
- 可以通过指针修改内存中的任意地址内容