指针也是变量,占有内存空间,用来保存内存地址。
指针也是一种数据类型,指针是一种数据类型,是指它所致内存空间的数据类型。
指针变量和它指向的内存块是两个不同的概念
*p操作内存
在指针声明时,*号表示所声明的变量为指针
在指针使用时,*号表示操作指针所指向的内存空间中的值
*p相当于通过地址(p变量的值)找到一块内存;
然后操作内存 *p放在等号的左边赋值(给内存赋值)
*p放在等号的右边取值(从内存获取值)
#include <iostream> using namespace std; #include <stdio.h> void change(int num){ num=666; } void changeA(int *num){ *num=666; } void printfSingleArrayInt(int *p,int n){ cout<<"/**********************************/"<<endl; cout <<p<< endl; cout<<sizeof(p)<<endl;//4 for(int i=0;i<n;i++){ cout<<*(p+i)<<endl; } cout<<"/**********************************/"<<endl; } void printfSingleArrayIntS(int a[10]){ cout<<"/*****************s*****************/"<<endl; cout<<sizeof(a)<<endl;//4 for(int i=0;i<10;i++){ cout<<*(a+i)<<endl; } cout<<"/**********************************/"<<endl; } int main(){ int a[10]={0}; for(int i=0;i<10;i++){ a[i]=i; } int *p; //指针的步长,根据所指内存空间类型来定。 cout<<sizeof(p)<<endl;//4 p=a; cout<<sizeof(p)<<endl;//4 cout<<sizeof(a)<<endl;//40 cout<<sizeof(a+1)<<endl;//4 cout<<sizeof(&a)<<endl;//4 cout<<sizeof(&a+1)<<endl;//4 printfSingleArrayInt(p,10); printfSingleArrayIntS(a); printf("%d %d\n",a,a+1); printf("%d %d\n",&a,&a+1); return 0; } int main01() { int num=100; int *p=# cout <<&num<< endl;//打印num的地址 num=1;//直接修改num的值 cout <<num<< endl;//打印num的值 *p=100000;//间接修改num的值 //*p放在等号的左边间接修改内存空间的值 /** *p 的意义:*就像一把钥匙,根据一个指针变量的值,去修改门后门的内存空间 **/ cout <<num<< endl; change(num); cout <<num<< endl; /* 间接赋值成立的三个条件 a)2个变量(通常一个实参,一个形参) b)建立关系,实参取地址赋给形参指针 c)*p形参去间接修改实参的值 */ changeA(p); cout <<num<< endl; int a=*p;////*p放在等号的右边从内存空间中拿值 cout <<a<< endl; /* { char *b=NULL; *b=‘j‘; } */ return 0; }
cout<<sizeof(a)<<endl;//40 a所对应的地址所包含数据类型的长度 cout<<sizeof(a+1)<<endl;//4 cout<<sizeof(&a)<<endl;//4 &a是数组a的地址,占四个字节 cout<<sizeof(&a+1)<<endl;//4 &a+1是数组a+1的地址,占四个字节
a,a[0],&a这三个元素打印的地址是相同的。
a+i 表示的是以内存地址a移动了i个int的地址。
printf("%d %d\n",a,a+1);
printf("%d %d\n",&a,&a+1);
&a 与 &a+1 之间相差了几个元素呢?
&a代表的是把数组看成一个整体取地址
&a + 1 则表示数组作为一个整体移动了一个元素(数组)。
间接赋值成立的三个条件
a)2个变量(通常一个实参,一个形参) b) 建立关系,实参取地址赋给形参指针 c) *p形参去间接修改实参的值
时间: 2024-11-06 10:06:34