首页 > 其他分享 >指针

指针

时间:2023-12-29 22:31:53浏览次数:24  
标签:pnum int ++ num printf 指针

通过指针打印地址和内容

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int num = 100;
	printf("%p\n",&num);
	int* pnum = #
	printf("%p\n",pnum);//此时pnum里面存放的就是num的地址
	printf("%d\n", *pnum);//指向的是num空间里的内容
	return 0;
}

通过指针对常量进行访问,不同指针类型可以一次访问空间不同

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int num = 0x12345678;
	char* p1 = #
	short* p2 = #
	int* p3 = #
	long* p4 = #
	//十六进制两个数字在内存中占一个字节---四位二进制代表一个数字   
	printf("0x%x\n",num);
	printf("0x%x\n",*p1);//一次访问一个字节访问后两位-78
	printf("0x%x\n", *p2);//一次访问两个字节访问后四位-5678
	printf("0x%x\n", *p3);//一次访问四个字节访问8位-12345678
	printf("0x%x\n", *p4);//一次访问四个字节访问8位-12345678
	return 0;
}

指针+1,物理地址加类型大小字节

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int num = 0x12345678;
	char* p1 = #
	short* p2 = #
	printf("0x%x\n",*p1);//78
	printf("0x%x\n", *(p1+1));//56
	printf("0x%x\n", *p2);//5678
	printf("0x%x\n", *(p2+1));//1234
	return 0;
}

指针与一维数组

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int num[5];
	printf("num=%p\n",num);
	printf("&num[0]=%p\n", &num[0]);
	return 0;
}

数组中元素地址是连续的

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//eg:int num[5]={10,20,30,40,50};--通过指针打印
int main()
{
	int num[5] = { 10,20,30,40,50 };
	for (int i = 0; i < 5; i++)//普通方式
	{
		printf("%d ",num[i]);
	}
	printf("\n");
	int* pnum = num;
	for (int i = 0; i < 5; i++)//指针方式  1
	{
		printf("%d ",*(pnum+i));
	}
	printf("\n");
	for (int i = 0; i < 5; i++)//指针方式  2
	{
		printf("%d ",pnum[i]);//指针名可以替代数组名
	}
	printf("\n");
	for (int i = 0; i < 5; i++)//指针代替数组名方式3  2
	{
		printf("%d ", *pnum);
		pnum += 1;
	}
	printf("\n");
	for (int i = 0; i < 5; i++)//(*num++不行)数组名某些情况也可以代替指针名方式3  2
	{
		printf("%d ", *(num+i));
		pnum += 1;
	}
	return 0;
}

*p++ 和 ++p区别(单目操作符)--不可以num++

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	//*p++先地址+1,再寻址取内容
	//++*p先寻址去内容,再内容+1
	//eg:
	int num[5] = { 10,20,30,40,50 };
	int* pnum = num;
	for (int i = 0; i < 5; i++)//*p++
	{
		printf("%d ", *pnum++);//10 20 30 40 50
	}
	printf("\n");
	int* pnum1 = num;
	for (int i = 0; i < 5; i++)//++*p
	{
		printf("%d ", ++*pnum1);//11 12  13  14  15
	}
	return 0;
}

数组指针

//数组指针:数组类型的指针

//类型  *[数组长度]

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int num[5] = {10,20,30,40,50};
	int(*pnum)[5] = NULL;//数组指针变量---pnum
	//num 代表首地址---&num[0]--类型:int*---整型指针
	//int (*pnum)[5]--pnum-----类型: int(*)[5]--整型数组指针
	pnum = (int(*)[5])num;//因为类型不同所以需要把num类型强转为数组指针类型
	printf("pnum=%p\n",pnum);
	printf("pnum+1=%p\n", pnum+1);//+20
	return 0;
}

二维数组类型表示

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int num[3][4] = { {1,2,3,4}, {4,5,6,7},{7,8,9,10} };
	int(*pnum)[4] = NULL;//数组指针变量--pnum
	int* pnum1 = NULL;
	//pnum--指针变量--指针类型表示 int (*)[4];
	//num--二维数组的数组名---首地址--该指针类型
	//int (*)[4]
	//&num[0]指针类型 int (*)[4]  --此时是第零行数组-属于数组,所以类型为数组指针
	pnum1 = &num[0][0];
	//&num[0][0] 指针类型 int *  --此时表示第零行第零列-属于元素,所以类型为int *
	return 0;
}

二级指针--保存一级指针的地址

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int num = 10;
	int* pnum = #
	int** ppnum = &pnum;
	printf("ppnum=%x\n",ppnum);//代表ppnum空间,存的是pnum的地址
	printf("*ppnum=%x\n", *ppnum);//代表pnum空间,存的是num的地址
	printf("**ppnum=%x\n", **ppnum);//代表num空间,存的是10
	
	printf("&pnum=%x\n", &pnum);//代表pnum的地址
	printf("pnum=%x\n",pnum);//代表pnum空间,存的是num的地址
	printf("*pnum=%x\n", *pnum);//代表num空间,存的是10
	
	printf("&num=%x\n", &num);//代表num的地址
	printf("num=%x\n", num);//代表num空间,存的是10
	return 0;
}

标签:pnum,int,++,num,printf,指针
From: https://blog.51cto.com/u_16425777/9032337

相关文章

  • const指针
    #include<iostream>usingnamespacestd;intmain(){//const指针intnum=1;intanother=2;//这个指针指向的内容,不能透过这个指针来修改//可以理解为constint*,constint的指针==>常量指针constint*p1=&num;*p1=3;......
  • 指针与数组
    数组名访问数组元素a[i]等价于*(a+i)数组名也是指针,但是是指针常量,指针操作赋值给普通指针inti,*pa,a[]={3,4,5,6,7,3,7,4,4,6};pa=a;a++;//不可以pa++;//可以inti,a[]={3,4,5,6,7,3,7,4,4,6};int*constpa=a;/*注意const的位置:不是constint*pa......
  • 代码随想录day 02 双指针 滑动窗口 螺旋矩阵
    有序数组的平方题目如下:如果是可以使用O(nlogn)或以上复杂度的算法,本题可以简单的先平方一遍,然后使用排序算法就可以了但是要求使用O(n)复杂度的算法,那么我首先想到的是昨天的快慢指针类似的想法:我想先平方一次数组,然后从中间开始排序,如下但是运行之后发现从中间开始进行相邻元......
  • 【C++】使用指针,动态多维数组
    二维数组intm=3,n=2;int**arr;//动态创建二维数组[3][2]arr=newint*[m];//这里是mfor(inti=0;i<m;i++){ arr[i]=newint[n];//这里是n}三维数组intx=3,y=4,z=5;//arr[3][4][5]int***arr;arr=newint**[x];for(inti=0;i<x;i++){......
  • 代码随想录day 01 二分法与快慢指针
    二分法题目:实现代码如下:值得注意的是实现的方法是利用左闭右开区间还是左闭右闭区间根据选择的不同,判断条件不同将迭代的值带入到条件看符不符合区间要求就不会混淆二者快慢指针题目:本题实际上可以通过二重for循环暴力求解,复杂度是O(n^2)但是测试过程中发现超时遂放弃......
  • 智能指针
    智能指针C++中的智能指针分为4类,分别是:共享指针(std:shared_ptr)独占指针(std::unique_ptr)auto_ptrweak_ptr其中,auto_ptr已被C++11标准摒弃,C++17标准已经不可用。智能指针的出现,能够很好的解决原始指针因为忘记释放内存而导致的一系列问题,或是因为删除不彻底而形成的空悬指针问题......
  • 指针
    指针---不同指针类型的区别指针类型决定了指针进行解引用操作的时候,能够访问空间的大小指针+1代表了不同的类型+1跳过的不同字节eg:#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ inta=0x11223344; /*int*pa=&a;//访问前四个 *pa=0;*/ char*pc......
  • 函数指针 int (*add)( )
    原文首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址;intAdd(intx,inty){returnx+y;}intmain(){printf("%p\n",&Add);//打印一下函数Add()的地址printf("%p\n",Add);//数组名等于数组首元素地址,那函数名是等于函数地址吗?->等于!......
  • C语言: 函数 值传递 || 指针传递
    在C语言中,函数可以使用指针传递和值传递来传递参数。通常情况下,使用值传递是最常见和最简单的方式。在值传递中,函数的参数会被复制一份,然后传递给函数。这意味着在函数内对参数的修改不会对原始数据产生影响。当你只需要传递一个简单的数据类型,如整数或浮点数时,值传递是......
  • 116.+117. 填充每个节点的下一个右侧节点指针(Ⅰ+Ⅱ)(中)
    目录题目题解:BFS题目给定一个完美二叉树(117的Ⅱ题不是完美二叉树,是二叉树,其余一样),其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:structNode{intval;Node*left;Node*right;Node*next;}填充它的每个next指针,让这个指针指向其下一个右侧......