这篇具有很好参考价值的文章主要介绍了C语言 DAY08 指针01。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。
1.概述
地址编号:地址编号:就是计算机为了存储数据,每一个程序在32机中占4G,以一个字节为最小单位进行操作,每一个字节都有其对应的地址,该地址就是地址编。
指针:地址编号的数据类型
指针变量:存储地址编号的变量,其数据类型为指针
在32位机中一个指针占4B
在
64
位机中一个指针占
8B
代码:
#include<stdio.h>
int main(int argc, char const *argv[])
{
printf("char *的大小为:%ld\n",sizeof(char *));
printf("int *的大小为:%ld\n",sizeof(int *));
printf("short *的大小为:%ld\n",sizeof(short *));
printf("long *的大小为:%ld\n",sizeof(long *));
printf("float *的大小为:%ld\n",sizeof(float *));
printf("double *的大小为:%ld\n",sizeof(double *));
return 0;
}
2.指针变量
指针变量实质上是一个变量,存放的是数据类型为指针的地址编号
1.定义:
数据类型 变量名
2.分类:
char * 储存数据类型为字符型的地址编号 字符指针
int * 储存数据类型为整型的地址编号 整型指针
short *储存数据类型为短整型的地址编号 短整型指针
long *储存数据类型为长整型的地址编号 长整型指针
float *储存数据类型为float的地址编号 单精度浮点型指针
double *储存数据类型为double的地址编号 双精度浮点型指针
如:
int num = 10;
int *p ;
注意:
如果同时定义多个指针变量的时候,每个指针变量前都要加*
如:
void fun()
{
int a,b,c;
int *p1,*p2,*p3;
}
初始化:
1,当指针变量是局部变量,在其定义时没有给其值,此时系统将随机为其给一个值,这种指针称为野指针
如:
int *p;
2,当指针变量值等于NULL时,这种指针称为空指针
如:
int *p = NULL;
3,定义指针变量时赋真实的地址
如:
int num = 10;
int *p = #
如:
int num = 10;
int *p ;
p = #
运算符:
&
作用:取地址
&要取地址的变量
注意:只能获取变量的地址
代码 :
#include <stdio.h>
char c = 'a';
int main(int argc, char const *argv[])
{
int num = 10;
int *p = #
printf("p = %p\n",p);
char *p2 = &c;
printf("p2 = %p\n",p2);
//int *p3 = &10;
const int num02 = 10;
int *p4 = &num02;
printf("p4 = %p\n",p4);
return 0;
}
*
作用:取值或改值
*指针变量名
示例
#include <stdio.h>
int main(int argc, char const *argv[])
{
int num = 10;
int *p = #//此时*
表示变量
p
是
int
型的指针变量
printf("*p=%d\n",*p);//此时*
表示为取值
*p = 1;//修改p
指向的地址的值
printf("num=%d\n",num);
return 0;
}
3.指针类型
指针本身的类型
口诀:将指针变量的变量名去除,剩余的就是指针本身的类型
如:
int *p1;// int *
int **p2;//int **
int (*p)(int int);//int (*)(int,int)
...
示例:
int num = 10;
int *p = &num ;
char *p2 = #
指针指向的数据的数据类型
口诀:将指针变量的变量名和与它离得最近的*去除
,
剩余的就是指针本身的类型
如:
int *p1;// int
int **p2;//int *
int (*p)(int int);//int (int,int)
取值宽度
指针变量的数据类型的长度就是指针的取值宽度
char * 取值宽度 1
int * 取值宽度 4
float * 取值宽度 4
单位跨度(步长)
就是地址在进行加减时,地址所增减的数据类型的长度(字节数)
int * 单位跨度为4字节
char * 单位跨度为1字节
short * 单位跨度为2字节
示例:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int num = 0x01020304;
char *p = (char* )#
/*
注意:
在
liunx
系统中数据存储将倒序
所以num
在内存中存储的顺序为
0x04 0x03 0x02 0x01
将num
地址强制转换为
char *
类型
此时取值宽度为1
字节
,
单位跨度为
1
字节
p为首个字节存储的地址
+1,
加的是一个单位跨度即
1
字节
所以从第二个字节开始取1
个字节长度的数据
即0x03
*/
printf("%#p\n",*(p+1));
/*
将num
地址强制转换为
short *
类型
此时取值宽度为2
字节
,
单位跨度为
2
字节
p为首个字节存储的地址
+1,
加的是一个单位跨度即
2
字节
所以从第三个字节开始取2
个字节长度的数据
即:0x0102
*/
short * p2 = (short *) #
printf("%#p\n",*(p2+1));
return 0;
}
4.void
作用
void与指针结合作为一种指针类型,如void *,这种指针我们称为万能指针,意味着任何一种地址都可以赋值给类型的指针变量
示例
#include <stdio.h>
int main(int argc, char const *argv[])
{
int num01 = 10;
char c = 'a';
short s = 1;
//
int *p1 = &num01;
char *p2 = &c;
short *p3 = &s;
//
void *p4 = &num01;
void *p5 = &c;
void *p6 = &s;
return 0;
}
5.指针变量使用的注意事项
1,
野指针操作会出现段错误
定义一个局部变量的指针,并不给其赋值,它将不知道指向哪一块地址,所以叫野指针
代码:
void fun01() 文章来源:https://www.toymoban.com/news/detail-744953.html
{ 文章来源地址https://www.toymoban.com/news/detail-744953.html
//野指针
int *p;
printf("*p=%d\n",*p);
}
2,空指针操作会出现段错误
定义一个NULL的指针,叫空指针
代码:
void fun02()
{
//空指针
int *p = NULL;
printf("*p=%d\n",*p);
}
3,
不要对万能指针进行操作
void fun03()
{
int num = 10;
int *p = #
printf("*p=%d\n",*p);
void *p2 = #
printf("*p2=%d\n",*p2);
}
4,
操作指针变量不要越界
代码:
void fun04()
{
int num = 0x01020304;
int *p = #
char *p2 = (char *) p;
printf("%#p\n",*p2);
printf("%#p\n",*(p2+1));
char c = 'a';
char * p3 = &c;
//1
int *p4 = (int *)p3;
printf("%#p\n",*p4);
}
到了这里,关于C语言 DAY08 指针01的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!