通过指针打印地址和内容
#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