IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言中指针使用 -> 正文阅读

[C++知识库]C语言中指针使用

指针概述

C语言中指针也可以认为是一种类型,不同于数值型和字符型的类型。推演过去指针变量也就是相当于不同的变量类型,不同于数值变量、字符型变量、字符串变量。

指针变量两种类型:自身类型和指向的类型
自身类型:将变量名去掉,剩下的就是指针变量类型。
指向类型:将变量名和离它最近的一个*去掉,剩下的类型就是指针指向的类型

int num = 10;
int* p = NULL;
p = #

如代码中 指针变量的自身类型是 int * 型;指向类型是 int 型。

自身类型

自身类型是指变量p本身的类型,变量p中放的是地址内容,地址指向的是放整型的数据,为什么需要说是指向整型的地址呢?因为不同类型数据占据的不同大小的一整块内存,整型是一个占4字节大小的一个整体内存,字符型是一个占2个字节大小的一个整体内存,编译器不会把它们拆分开。如定义了一个int型变量,它的地址是0x7fffffff00,紧接着马上定义一个char型变量,他的地址就直接到了0x7fffffff04。从0x7fffffff00 ~ 0x7fffffff04中间不会再被分开了放int型数据,0x7fffffff04 ~ 0x7fffffff06中间不分开放char型数据。
所以 自身类型 是基本类型 + *组合而成,虽然里面放的都是地址,但是地址指向的一整块内容是有区别的。

指向类型

指向类型 是指 指针变量中放置的地址是指向的内容类型。

int num = 10;
int* p = NULL;
p = #
int** pp = NULL;
pp = &p;

这是一个二级指针,指向的类型是int*,说明变量pp指向的是指针类型的数据。

代码例子

代码1

  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5     int num = 100;
  6     printf("num = %d, num address = %#lx\n", num, &num);
  7     //num = 100, num address = 0x7ffd4376ff4c   
  8 
  9     int* p = NULL;
 10     p = &num;
 11     printf("*p = %d, p =  %#lx, &p = %#lx\n", *p, p, &p);
 12     //*p = 100, p =  0x7ffd4376ff4c, &p = 0x7ffd4376ff40
 13 
 14     int** pp = NULL;
 15     pp = &p;
 16     printf("**pp = %d, *pp = %#lx, pp = %#lx\n", **pp, *pp, pp);
 17     //**pp = 100, *pp = 0x7ffd4376ff4c, pp = 0x7ffd4376ff40
 18 
 19     int arr[5]= {10,20,30,40,50};
 20     printf("arr address = %#lx, arr[0] address = %#lx, arr[0] = %d\n",arr,&arr[0],arr[0]);
 21     //arr address = 0x7ffd4376ff20, arr[0] address = 0x7ffd4376ff20, arr[0] = 10    
 22 
 23     int* parr = NULL;
 24     parr = arr;
 25     printf("parr = %#lx, *parr = %d, *(parr+2) = %d\n",parr,*parr,*(parr+2));
 26     //parr = 0x7ffd4376ff20, *parr = 10, *(parr+2) = 30
 27     
 28     char str[6]= {'a','d','m','i','n','\0'};
 29     printf("str address = %#lx, str[0] address = %#lx, str[1]= %c\n", str, &str[0],str[1]);
 30     //str address = 0x7ffd4376ff10, str[0] address = 0x7ffd4376ff10, str[1]= d  
 31 
 32     char* pstr = NULL;
 33     pstr = str;
 34     printf("pstr = %#lx,*pstr = %c,*(pstr+2)= %c\n",pstr,*pstr,*(pstr+2));
 35     //pstr = 0x7ffd4376ff10,*pstr = a,*(pstr+2)= m
 36 
 37     char str2[6] = "admin";
 38     printf("str2 = %#lx, str2[0] address = %#lx, str2 = %s, str2[1]= %c\n",str2,&str2[0],str2,str2[1]);
 39     //str2 = 0x7ffd4376ff00, str2[0] address = 0x7ffd4376ff00, str2 = admin, str2[1]= d
 40 
 41     char* pstr2 = NULL;
 42     pstr2 = str2;
 43     printf("pstr2 = %#lx, pstr2 = %s\n",pstr2, pstr2);
 44     //pstr2 = 0x7ffd4376ff00, pstr2 = admin       
 45 }

代码2

  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5     float num = 10;
  6     printf("num = %f, &num = %#lx\n\n", num, &num);
  7     //num = 10.000000, &num = 0x7ffcdf7ffd94
  8 
  9     float* pnum = &num;
 10     printf("*pnum = %f, pnum = %#lx, &pnum = %#lx\n\n ", *pnum, pnum, &pnum);
 11     //*pnum = 10.000000, pnum = 0x7ffcdf7ffd94, &pnum = 0x7ffcdf7ffd88
 12 
 13     float** p_pnum = &pnum;
 14     printf("**p_pnum = %f, *p_pnum = %#lx, p_pnum = %#lx\n\n",**p_pnum,*p_pnum,p_pnum);
 15     //**p_pnum = 10.000000, *p_pnum = 0x7ffcdf7ffd94, p_pnum = 0x7ffcdf7ffd88
 16     
 17     char arr[10] = {'a','d','m','i','n'};
 18     printf("arr[0]= %c, arr[5]= %c, arr[6]= %c, arr = %s\n",arr[0],arr[5],arr[6],arr);
 19     printf("&arr[0]= %#lx, &arr[1]= %#lx, arr= %#lx\n\n", &arr[0], &arr[1], arr);
 20     //arr[0]= a, arr[5]= , arr[6]= , arr = admin
 21     //&arr[0]= 0x7ffcdf7ffd70, &arr[1]= 0x7ffcdf7ffd71, arr= 0x7ffcdf7ffd70
 22 
 23     char* parr = NULL;
 24     parr = arr;
 25     printf("*parr = %c, *(parr+4)=%c, *(parr+5)=%c, parr = %s\n",*parr,*(parr+4),*(parr+5),parr);
 26     printf("parr = %#lx, parr+4 = %#lx, parr+5= %#lx\n\n", parr, parr+4, parr+5);
 27     //*parr = a, *(parr+4)=n, *(parr+5)=, parr = admin
 28     //parr = 0x7ffcdf7ffd70, parr+4 = 0x7ffcdf7ffd74, parr+5= 0x7ffcdf7ffd75
 29     
 30     char str[10]= "admin";
 31     printf("str[0]= %c, str[5]= %c, str[6]= %c, str = %s\n",str[0],str[5],str[6],str);
 32     printf("&str[0]= %#lx, &str[1]= %#lx, str = %#lx\n\n", &str[0], &str[1], str);
 33     //str[0]= a, str[5]= , str[6]= , str = admin
 34     //&str[0]= 0x7ffcdf7ffd60, &str[1]= 0x7ffcdf7ffd61, str = 0x7ffcdf7ffd60
 35 
 36     char* pstr = NULL;
 37     pstr = str;
 38     printf("*pstr= %c, *(pstr+4)= %c, *(pstr+5)= %c, pstr = %s\n", *pstr, *(pstr+4), *(pstr+5), pstr);
 39     printf("pstr = %#lx, pstr+4=%#lx, pstr+5= %#lx\n\n",pstr, pstr+4, pstr+5);
 40     //*pstr= a, *(pstr+4)= n, *(pstr+5)= , pstr = admin
 41     //pstr = 0x7ffcdf7ffd60, pstr+4=0x7ffcdf7ffd64, pstr+5= 0x7ffcdf7ffd65
 42 }

数值型指针

数值型指针: int* p;
如:

int num = 100;
int* p = &num;		//同时定义和初始化

int* p1 = NULL;		//定义
p1 = &num;			//初始化

字符型指针

字符型指针可以分为指针指向的是单字符还是字符数组两种

单字符

字符型指针: char* p;

char name = 'a';
char* p = &name;
printf("p = %c",*p);	//结果是 a

这里需要注意需要用 占位符 %c 去承接内容(或者说显示内容)

字符数组

字符型指针:char* p;

char arr[6] = {'a','d','m','i','n','\0'};
printf("arr = %s, arr = %#lx\n",arr,arr);	//admin,0x7ffffffc0
printf("arr[0]= %c,arr[1]= %c\n",arr[0],arr[1]);//a,d

char* parr = NULL;
parr = arr;     //也可以 parr =  &arr,但是编译时会报warning
printf("parr = %s, parr = %#lx\n", parr,parr);	//admin,0x7ffffffc0
printf("*(parr)= %c,*(parr + 1) = %c\n",*parr, *(parr+1));     

这里需要注意字符数组末尾需要加‘\0’字符表示字符数组结束,或者编译器自己会自动加上,所以在定义字符数组长度时需要加+1。
注意 字符数组名既可以表示地址也可以表示整个字符数组的内容,而不是第一个字符。相应的指针也是整个字符数组的内容。

printf("arr = %c\n", arr);		
printf("parr = %c\n", parr);

以上两行代码可以编译过但是不能显示内容,需要用占位符%s去承接整个字符数组内容。

字符串型指针

字符型指针:char* p;

char str[5] = "admin";
printf("str = %s,str = %#lx\n",str,str); // admin,0x7ffffffe0.
printf("str[0]= %c, str[1]= %c\n",str[0],str[1]);	// a,d
char* pstr = NULL;
pstr = str;
printf("pstr = %s, pstr = %#lx\n",pstr,pstr); // admin,0x7ffffffe0.
printf("*pstr = %c,*(pstr+1) = %c\n",*pstr,*(pstr+1)); // a,d

如代码中结果显示所示,字符串数组名即是地址,同时也是数组内容,根据占位符的不同显示不同内容,占位符为%s时显示字符串,%#lx显示地址。同样的对于赋值给的指针变量也具有同样的功能。
但是如果这里

printf("str = %c\n",str);	//可以编译过但是不显示任何信息

字符数组总结

  1. 字符数组和字符串数组名都可以即表示地址又表示地址对应的内容,注意看需要它以什么形式显示,显示内容用%s,显示地址用%#lx。
  2. 字符数组和字符串数组名对应的地址都是第一个字符所在的地址。如上面的代码中 &arr[0] 和 arr 得到的地址相同
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 17:55:54  更:2022-05-24 17:56:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:21:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码