首页 > 其他分享 >指针day1

指针day1

时间:2023-07-25 15:56:34浏览次数:28  
标签:p0 int Address value day1 printf 指针

指针

一:指针代码示例

B站视频

代码

#include <stdio.h>
int main(){
	int a=1025;
	int *p;
	p = &a;
	printf("size of integer is %d bytes \n",sizeof(int));
	printf("Address = %d, value = %d\n",p,*p);
	printf("Address = %d, value = %d\n",p+1,*(p+1));
	char *p0;
	p0 =(char*)p;//typrcasting (类型转换) 
	printf("size of char is %d bytes \n",sizeof(char));
	printf("Address = %d, value = %d\n",p0,*p0);
	printf("Address = %d, value = %d\n",p0+1,*(p0+1));
	
	//1025 = 00000000 00000000 00000100 00000001
} 

运行结果

size of integer is 4 bytes
Address = 6487564, value = 1025
Address = 6487568, value = 0
size of char is 1 bytes
Address = 6487564, value = 1
Address = 6487565, value = 4

小结:

  1. int类型的大小是4 bytes

  2. char类型的大小是1 bytes

  3. &是地址运算符:&a表示a的地址

  4. *是间接(或解引用)运算符:示例

    a = 2;
    ptr = &a;  //ptr是指向 a 的指针,把a的地址符赋给 ptr 
    c = *ptr;  //把ptr指向的地址上的值赋给 c 
    

    最终结果是把2赋给了c

  5. 因为p是指向整形的指针,而p0是一个指向字符的指针

p0 =(char*)p; //做的是类型转换
  1. 最后打印出*p0的值是1
	printf("Address = %d, value = %d\n",p0,*p0);

是因为*p是char类型,只占1个 bytes ,而p是int 类型有4 个bytes,1025= 00000000 00000000 00000100 00000001 *p中就只能读取1个字节也就是 00000001,所以最后的结果是1

  1. 最后*p0+1的结果是4
printf("Address = %d, value = %d\n",p0+1,*(p0+1));

是因为p0+1 把我们带到下一个字节,也就是 00000100 ,这个字节的值就是4

二:指针指向指针

代码

//指针指向指针 
#include <stdio.h>
int main(){
	int x=5;
	int *p;
	p = &x;
	*p = 6;//更改了x的值 
	int** q; 
	q = &p;// 创建一个q来存放p的地址 ,q指向p,q的类型是int** 
	int*** r;
	r = &q;
	printf("%d\n",*p);
	printf("%d\n",*q);
	printf("%d\n",*(*q));
	printf("%d\n",*(*r));
	printf("%d\n",*(*(*r)));
	***r=10;
	printf("x = %d\n",x);
	**q = *p +2;//*p的解引用是x,**q也是解引用x 
	printf("x = %d\n",x); 
	//如果比定义时少一个*那输出时就代表地址,不少就表示是数值 
} 

运行结果

6
6487572
6
6487572
6
x = 10
x = 12
  1. *p = 6;
    

​ 表示更改了x的值

  1. int** q; 
    q = &p;
    

    表示建一个q来存放p的地址 ,q指向p,q的类型是int**

  2. **q = *p +2;
    

    *p的解引用是x,**q也是解引用x ,就相当于对x加二

  3. 如果比定义时少一个*那输出时就代表地址,不少就表示是数值

三:把指针作为参数函数(传引用)

代码:

#include <stdio.h>
void Increment(int *p)//p是形参 ,因为p是指针,所以存放的是被调用过去 a 的地址 
{
	*p = *p+1;// p指向 a ,所以 p所指向的内存的值会加 1 
}
int main(){
	int a;//a是局部变量,只能在这个函数里面使用这个变量 
	a=10;//这个'a'是在main函数中的 ,main是主调函数,Increment是被调函数 
	Increment(&a);// a是实参 
	printf("a = %d",a); 
	
} 

输出结果:

a = 11
  1. void Increment(int *p)
    

​ p是形参 ,因为p是指针,所以存放的是被调用过去 a 的地址

  1. *p = *p+1;
    

​ p指向 a ,所以 p所指向的内存的值会加 1

  1. a是局部变量,只能在这个函数里面使用这个变量

  2. main是主调函数,Increment是被调函数

  3. Increment(&a);
    

​ a是实参

四:针和数组

代码:

#include <stdio.h>
int main(){
	int A[] ={2,4,5,8,1};
	printf("%d\n",A);//首元素的地址
	printf("%d\n",&A[0]);
	printf("%d\n",A[0]);
	printf("%d\n",*A); //首元素地址的数值
	
} 

输出结果:

6487552
6487552
2
2
  1. 表示地址:&A[i] or (A+i)

​ 表示数值:A[i] or *(A+i)

#include <stdio.h>

int main(){
	int A[] ={2,4,5,8,1};
	int i;
	for(i=0;i<5;i++){
		printf("Address = %d\n",&A[i]);
		printf("Address = %d\n",A+i);
		printf("value = %d\n",A[i]);
		printf("value = %d\n",*(A+i));
	} 
}
  1. 可以把数组赋给指针,从而让指针加1,写成p++,数组不能加1,写成A++,数组A自身不能进行自增
int *p = A;
	p++;

标签:p0,int,Address,value,day1,printf,指针
From: https://www.cnblogs.com/ninnne/p/17580059.html

相关文章

  • leetcode第354场周赛 2 - 双指针
    题目传送门2779.数组的最大美丽值题意给你一个数组和一个整数k,数组里面每个数都只能操作一次:加上区间\([-k,k]\)里的数。问你最终由相等元素组成的最长子序列的长度双指针的妙用!思路先排序,前后双指针取差值在2k之间的区间,此区间的所有数均可以操作为同一个属,ans统计最大值......
  • 析构函数虚表指针回填问题
    1问题提出笔者偶然发现对于含有虚函数的类,析构函数也会更新虚表指针。小有所得,特此记录。这里使用vs202232位debug作为实验环境。对于一个有虚函数的类,编译器在生成构造函数时,不只生成我们自己写的虚构函数里面的语句,还会把虚表地址赋值到对象中。比如如下类,构造函数里面根......
  • day12
    一、miao~1.得到的jpg,010打开在末尾发现wav文件2.foremost分离,Audacity打开查看频谱图,发现了CatCTF3.猜测是音频的解密密码,但是使用silenteye和steghide均无用,需使用deepsound进行解密,输入密码后得到flag.txt4.得到txt中的内容很像兽音,在线解密,得到flagCatCTF{d0_y0u_Ha......
  • 7.24 day1数据结构
    day1数据结构考试整场比赛打完了,没用数据结构?!结果:100+30+40+30=200T1正解异或好性质,100000以下最多128个因数枚举每个右端点,将前缀异或塞进桶里,同时枚举因数,看有几个和自己对应的前缀异或,直接计数即可T2暴力要输出分数,考场实在没办法,用浮点数做01分数规划,最后枚举分母(只......
  • 5 双指针
    双指针1数组-移除元素题目:给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例......
  • Mock 3: CEOI2021 Day1 P3
    让我简化一下题目吧:有两个玩家,A和B。A并不知道B的位置,但是B知道A的位置然后可以做相应的动作。让B在任何结点,做一个路径保证A肯定会抓到B或表示抓不到B。路径必须最短.每个回合B必须要往任何一个相邻的结点移动。 我是先考虑链的情况:非常明显的是肯定可以抓到。那么......
  • 09_指针提高
    指针提高二维数组详解intarr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};arr===>二维数组第0行地址===>arr[0]arr+1===>二维数组第一行地址===>arr[1]*(arr)===>第0行第0列地址===>arr[0][0]*(arr+1)+1===>第1行第1列地址===>arr[1][1]arr[......
  • C语言指针的常见问题
    1值传递下面看一个列子,student结构体中包含该学生的各种信息,我们在change函数中对其进行部分修改,再在主函数中输出其结果#include<stdio.h>#include<string.h>#defineformat"%d\n%s\n%f\n%f\n%f\n"structstudent{intnum;charname[20];floatscore[3]......
  • 11.数组名和指针(这⾥为指向数组⾸元素的指针)区别
    1intmain()2{3inta[2]={1,2};4int*p=a;5cout<<"a+1"<<a+1<<endl;6cout<<"p+1"<<p+1<<endl;7cout<<"*(a+1)"<<*(a+1......
  • day10 栈与队列
    232.用栈实现队列题解:这一题在大学的时候学过,用两个栈来实现队列,队列是先进先出,而栈是先进后出,所以需要两个栈一个用来存队列入队的数据,出队列的时候,需要将顺序调转,这时候就需要用到另一个队列,注意好边界条件就行225.用队列实现栈题解:队列实现栈的功能也不难,主要是想到栈......