指针day1

发布时间 2023-07-25 15:47:53作者: Ninnne

指针

一:指针代码示例

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++;