一、指针
地址和指针是计算机中两个重要的概念
程序运行过程中,变量或者程序代码被存储在以字节为单位组织的存储器。
如下所示:每个变量类型在内存单元中所占的字节大小不一样
#include<stdio.h>
int main()
{
char a = 'a';
printf("%d\n",sizeof(a)); //1
int b = 1;
printf("%d\n",sizeof(b)); //4
double c = 2;
printf("%d\n",sizeof(c)); //8
float d = 3;
printf("%d\n",sizeof(d)); //4
return 0;
}
1、直接访问
以 int 类型为例,定义三个变量,int x=20 , y=100 , z=30
假设给x分配的地址为1000~1003,则y和z分别分到的地址为1004~1007和1008~1011
我们在使用 printf("%d\n",x);打印出x的数值,这种使用变量的方法叫做“直接访问”。
2、指针访问
通过对变量的地址进行操作。把专门用来存放变量地址的变量称为指针变量,简称指针。当一个指针变量的值是另一个变量的地址,就表示指针变量指向那个变量。
#include<stdio.h>
int main()
{
int x = 10;
int* p ;
printf("x的地址为%p,x的值为%d\n",&x,x);
printf("p的地址为%p\n",p);
printf("========\n");
p = &x;
printf("%p\n",&x);
printf("x的地址为%p,x的值为%d\n",&p,*p);
}
指针定义
#include<stdio.h>
int main()
{
//定义一个指针
//类型 * 指针变量名
int *p ;
int *a , *b ; //定义多个指针变量时,每个指针变量前都要加*
//指针在使用前必须先赋值才可以使用,且被赋的值必须是地址
// *p = 10;
// printf("%d\n",*p); //err
//正确做法如下
int i ;
p = &i;
*p = 10;
printf("%d\n",*p);
//野指针:指针变量指向一个未知的空间,操作野指针对应的内存空间可能会报错
/*空指针:指针变量指向内存编号为0的空间 #define NULL ((void*)0) 操作空指针对应的内存空会报错
在程序中用作条件判断*/
//万能指针 void* 可以将所有指针类型赋值给万能指针,一般用作与函数形参
//C语言中空指针不指向任何单元
//指针的类型和它所指的变量的类型必须相同
return 0;
}
指针大小
在32位操作系统,所有的指针类型都是4个字节大小
在64位操作系统,所有的指针类型都是8个字节大小
const修饰指针
#include<stdio.h>
int main0302()
{
char str[] = "hello world";
char ptr[] = "good boy";
//常量指针
//指针可以指向其他地址,指针指向的内容是不可改变的
const char* p = str ; //char const *p
// *p = 'a'; //err
// p[2] = 'a'; //err,同上
p = ptr; //yes
printf("%s\n",p);
return 0;
}
int main0303(void)
{
char ktr[] = "I love you";
char btr[] = "me too";
//指针常量
//指针指向的地址不可以改变,但内容可以修改
char* const p = ktr ;
// p = btr; //err
// p[2] = 't'; //yes
// *p = 't'; //yes
printf ("%s\n",p);
}
指针和数组
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
//数组名是一个常量,不允许赋值
//数组名是数组首元素地址
//arr = 100; //err
int* p ;
p = arr;
// printf("%p\n",p);
// printf("%p\n",arr);
*p = 123;
// p++;
// printf("%p\n",arr); //输出0061FEF4
// printf("%p\n",p); //输出0061FEF8
for (int i = 0; i < 10; i++)
{
// * == [] ?
// printf("%d\n",*(arr+i));
// printf("%d\n",arr[i]); //err
// printf("%d\n",p[i]);
printf("%d\n",*p++);
}
printf("%p\n",arr); //输出0061FEF0
printf("%p\n",p); //输出0061FF18
}
多级指针
一级指针指向变量的地址
二级指针指向一级指针的地址
三级指针指向二级指针的地址
*三级指针 == 二级指针 == &一级指针
**三级指针 == *二级指针 == 一级指针 == &变量
***三级指针 == **二级指针 == *一级指针 == 变量