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? *p;

指针的运算符:

? ? ? ? &:取地址符,获取一个变量的地址。

? ? ? ? *:在定义一个指针变量时,起到标识作用。

注意:无论什么类型地址,都在存储单元的编号,在32bit下都是4个字节。

指针的引用:

? ? ? ? 指针变量中只能存放地址。

? ? ? ? int *p;? ? ? ? //定义一个int型指针变量????????

? ? ? ? int?a = 1;

? ? ? ? p= &a;? ? ? ? //int型指针变量p指向int型变量a的地址

指针和变量的关系:

????????????int a=1;
?? ?????????int *p;
?? ?????????p = &a;

????????????printf("%d\n",a);
?? ?????????printf("%p\n",&a);
?? ?????????printf("%d\n",*&a);
?? ?????????printf("%p\n",p);
?? ?????????printf("%p\n",*&p);
?? ?????????printf("%d\n",*p);
?? ?????????printf("%p\n",&*p);

什么是字节序:

? ? ? ? 大端序:将数据的地位字节存放在内存的高位地址,高位字节存放在低位地址。

? ? ? ? 小端序:将地位放在低地址处,高位放在高地址处。

? ? ? ?判断是否为小端序

?int main()
{
?? ?int a=0x12345678;
?? ?int b=0x78563421;
?? ?char *p1,*p2;
?? ?p1=(char*)&a;
?? ?p2=(char*)&b;
?? ?printf("%x?? ?%x\n",*p1,*p2);
?? ?printf("%p?? ?%p\n",p1,p2);
?? ?
?? ?p1++;
?? ?p2++;
?? ?printf("%x?? ?%x\n",*p1,*p2);
?? ?printf("%p?? ?%p",p1,p2);?? ?
?? ?
?? ?
?? ?return 0;
}

指针与数组之间的关系:

? ? ? ? 将指针变量放在数组中。

int?a[10];

int *p;

p=&a[0];? ? ? ??

指针数组与数组指针:

? ? ? ? 指针数组:????????

? ? ? ? ? ? ? ? 概念:本质是数组,数组中的每一个元素是一个指针变量。

? ? ? ? ? ? ? ? 定义方法:类型符? *数组名 【元素个数】

int main()
{
?? ?int a[5]={1,3,4,6,7};
?? ?int *b[5]={NULL};
?? ?int i;
?? ?for(i=0;i<5;i++)
?? ?{
?? ??? ?b[i]=&a[i];
?? ??? ?printf("%d\n",*b[i]);
?? ??? ?printf("%p\n",b[i]);
?? ?}?? ?
}????????????????

????????数组指针:

? ? ? ? ? ? ? ? 定义:本质是一个指针,这个指针指向一个数组的首地址。

? ? ? ? ? ? ? ? 定义方法:类型符 (*指针名)【元素个数】

int arr[3][5];

int (*p)[5];

p=arr;

arr+i == ?&arr[i]
*(arr+i)== *&arr[i]===arr[i]
arr[i]+j==&arr[i][j]
*(arr[i]+j)==*&arr[i][j]==arr[i][j]==*(*arr+i+j)

int main()
{
?? ?int arr[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
?? ?int (*parr)[5];
?? ?parr = arr; ? ? //数组的首地址
?? ?int i, j;
?? ?for(i=0;i<3;i++)
?? ?{
?? ??? ?for(j=0;j<5;j++)
?? ??? ?{
?? ??? ??? ?printf("%d?? ?",parr[i][j]);
?? ??? ??? ?printf("%d?? ?",*(parr[i]+j));
?? ??? ??? ?printf("%d?? ?",*(*(parr+i)+j));
? ? ? ? ? ? printf("%p",&parr[i][j]);
?? ??? ??? ?printf("%p",parr[i]+j);
?? ??? ??? ?printf("%p",(parr+i)+j);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
?? ?printf("%d\n",parr[0][0]+2*5+2);
?? ?printf("%p",&parr[0][0]+2*5+2);
?? ?
?}?

? ? ? ? ? ? ? ? 说明:arr指向了数组中第0行的地址。

指针变量做函数形参:?

? ? ? ? 一维数组:?

int print_arr(int *parr ,int l)
{
?? ?int i;
?? ?for(i=0;i<l;i++)
?? ?{
?? ??? ?printf("%d?? ?",parr[i]);
?? ?}
?? ?return 0;
}

int scanf_arr(int *parr,int l)
{
?? ?int i;
?? ?for(i=0;i<l;i++)
?? ?{
?? ??? ?scanf("%d",parr[i]);
?? ?}
?? ?return 0;
}

int main()
{
?? ?int arr[5]={0};
?? ?int *parr;
?? ?parr = arr;
?? ?scanf_arr(parr,5);
?? ?print_arr(parr,5);
?? ?
}

????????????????

? ? ? ? ? 二维数组:

void print_a(int (*parr)[5],int h,int l)
{
?? ?int i,j;
?? ?for(i=0;i<h;i++)
?? ?{
?? ??? ?for(j=0;j<l;j++)
?? ??? ?{
?? ??? ??? ?printf("%d?? ?",parr[i][j]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}?? ?
}
void pingjun(int (*parr)[5], int h,int l)//总和?
{
?? ?int i,j;
?? ?int sum=0;
?? ?for(i=0;i<h;i++)
?? ?{
?? ??? ?for(j=0;j<l;j++)
?? ??? ?{
?? ??? ??? ?sum=sum+parr[i][j];
?? ??? ?}
?? ?}
?? ?printf("%d\n",sum);
?? ?printf("%d\n",sum/15);
}
void hang(int (*parr)[5],int h,int l)//行之和?
{
?? ?int i,j;
?? ?int sum=0;
?? ?for(i=0;i<h;i++)
?? ?{
?? ??? ?for(j=0;j<l;j++)
?? ??? ?{
?? ??? ??? ?sum=sum+parr[i][j];
?? ??? ?}
?? ??? ?printf("%d\n",sum);
?? ??? ?sum=0;
?? ?}
}
void lei(int (*parr)[5],int h,int l)//列之和?
{
?? ?int i,j;
?? ?int sum=0;
?? ?for(j=0;j<l;j++)
?? ?{
?? ??? ?for(i=0;i<h;i++)
?? ??? ?{
?? ??? ??? ?sum=sum+parr[i][j];
?? ??? ?}
?? ??? ??? ?printf("%d\n",sum);
?? ? ? ??? ?sum=0;
?? ?}
}


int main()
{
?? ?int arr[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
?? ?int (*parr)[5];
?? ?parr=arr;
?? ?print_a(parr,3,5);
?? ?pingjun(parr,3,5);
?? ?printf("\n");
?? ?hang(parr,3,5);
?? ?printf("\n");?
?? ?lei(parr,3,5);
?? ?return 0;
}? ?

指针函数与函数指针:?

? ? ? ? 指针函数:

? ? ? ? ? ? ? ? 本质是一个函数,函数的返回值是一个指针。

? ? ? ? ? ? ? ? 格式:类型 *函数名(形参)? ?

char s[140]="hello,world";
char *zzz()
{
?? ?return s;
}

int main()
{
?? ?char *p;
?? ?p=zzz();
?? ?printf("%s",p);
?? ?return 0;
}

????????函数指针:

? ? ? ? ? ? ? ? 本质是指针,指向一个函数

? ? ? ? ? ? ? ? 格式:返回值类型 (*函数名)(形参)

int max(int a,int b)
{
?? ?return a+b;
}
int cheng(int a ,int b)
{
?? ?return a*b;
}

int main()
{
?? ?int a=10;
?? ?int b=20;
?? ?int (*pmax)(int a,int b);//声明一个函数指针?
?? ?int (*pcheng)(int a,int b);
?? ?pmax=max;
?? ?printf("%d",pmax(a,b));
?? ?pcheng=cheng;
?? ?printf("%d",pcheng(a,b));
?? ?return 0;
}
?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 00:51:43  更:2022-09-04 00:54:10 
 
开发: 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年5日历 -2024/5/19 10:03:30-

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