关键词:* 号的意义
、传值调用和传址调用
、常量与指针
程序中的变量是一段存储空间的别名,本质上是一段存储空间。
问题:程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间?
问题:是不是只能通过变量使用存储空间?
#include<stdio.h>
int main()
{
int i = 5;
int* p = &i;
printf("i = %d, p = %p\n", i, p);
*p = 10;
printf("change_i = %d, p = %p\n", i, p);
return 0;
}
总结: 可以通过指针来使用存储空间。
1. * 号的意义
在指针声明时, * 号表示所声明的变量为指针;
在指针使用时,* 号表示取指针所指向的内存空间中的值。
指针的特殊点:
指针的本质是变量,但变量的值是一个内存地址;
*号在指针中类似一把钥匙,通过这把钥匙可以打开内存,读取内存中的值。
小贴士:
#include<stdio.h>
int main()
{
int i = 5;
int* pI = NULL;
char* pC = NULL;
float* pF = NULL;
pI = &i;
*pI = 10;
printf("&i = %p, pI = %p, i = %d\n", &i, pI, i);
printf("sizeof(int) = %d, sizeof(int*) = %d, &pI = %p\n", sizeof(pI), sizeof(int*), &pI);
printf("sizeof(char) = %d, sizeof(char*) = %d, &pC = %p\n", sizeof(pC), sizeof(char*), &pC);
printf("sizeof(float) = %d, sizeof(float*) = %d, &pF = %p\n", sizeof(pF), sizeof(float*), &pF);
return 0;
}
输出结果:
&i = 0xbff7d6c0, pI = 0xbff7d6c0, i = 10
sizeof(int) = 4, sizeof(int*) = 4, &pI = 0xbff7d6c4
sizeof(char) = 4, sizeof(char*) = 4, &pC = 0xbff7d6c8
sizeof(float) = 4, sizeof(float*) = 4, &pF = 0xbff7d6cc
在同一编译器下,指向不同类型的指针占用内存的大小一样的原因:指针为变量,保存地址值,对于一台计算机,它的内存地址占用的空间跟地址总线有关,我们常说的32位系统,64位系统指的是内存地址的寻址范围,当使用32位系统的编译器,它的寻址范围也就是32位,即4个字节;换句话说所有的32系统上的指针变量都可以用4个字节存储任意类型的地址值。
2. 传值调用和传址调用
- 指针是变量,因此可以声明指针参数
- 当一个函数体内部需要改变实参的值,则需要使用指针参数
- 函数调用时实参值将复制到形参
- 指针适用于复杂数据类型作为参数的函数中,如果通过一个很大的结构体来调用一个函数,往往将这个函数的参数声明为指针参数。
例子;当一个函数体内部需要改变实参的值,则需要使用指针参数——两个值的交换
#include<stdio.h>
void exchange1(int* a, int* b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int m = 1;
int n = 2;
printf("m = %d, n = %d\n", m, n);
exchange1(&m, &n);
printf("m = %d, n = %d\n", m, n);
return 0;
}
输出结果:
m = 1, n = 2
m = 2, n = 1
总结:通过传址调用来交换两个值
3. 常量与指针
指针的本质就是变量,而关键字const可以修饰一个变量 ==> 可以用const来修改指针。
const int* p; // p的值是变量,p指向的内容不可变,即p可以重新赋地址值,但*p不能重新赋值;
int const* p; //p的值是变量,p指向的内容不可变,即p可以重新赋地址值,但*p不能重新赋值;
int* const p; // p的值不可变,p指向的内容可变,即p不可以重新赋地址值, *p可以重新赋值
const int* const p; // p和p指向的内容都不可变,即p不可以重新赋地址值, *p不可以重新赋值
口诀: 左数右指
当const出现在* 号左边时指针指向的数据为常量;
当const出现在* 号右边时指针本身为常量。
#include<stdio.h>
int main()
{
int j = 10;
int i = 5;
int m = 1;
int n = 2;
const int* pI = &i;
pI = &j; // right:assignment of read-only location ‘*pI’
// *pI = 0; // Error
int const* pJ = &j;
pJ = &i; // right
// *pJ = 0; // Error: assignment of read-only location ‘*pJ’
int* const pM = &m;
// pM = &n; // Error:assignment of read-only variable ‘pM’
*pM = 100;
const int* const pN = &n;
// pN = &m; // Error:assignment of read-only variable 'pN'
// *pN = 10; // Error: assignment of read-only location '*pN'
return 0;
}
4.小结
- 指针是C语言中一种特别的变量
- 指针所保存的值是内存的地址
- 可以通过指针修改内存中的任意地址内容
声明:此文章为本人在学习狄泰软件学院《C语言深度解析》所做的笔记,文章中包含狄泰软件资料内容一切版权归狄泰软件所有!