一、内存
内存:
存在内存里的。
内存分了N多个小空间,每个小空间1个字节
每个小空间有它自己的地址。每个地址之间差1
int类型占用4个字节,等于占了4个空间(有4个地址),不需要记住4个地址,而记住首地址就行了(因为首地址相当于入口或者生活中的门)
指针:
指针就是地址,地址就是指针。
地址:内存的地址
内存中的地址:
其实也是从1开始编号,然后一直自增
1M内存,1024个地址
0x7fff5fbff7cc:这叫16进制
十进制:逢10进1 有:0 1 2 3 4 5 6 7 8 9
逢十进1
9 10
十六进制:就是逢16进1
有:0 1 2 3 4 5 6 7 8 9 a b c d e f
以0x开头
简单说1-10
0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf
16:0x10
0x35:53
0xa0:160
顺带说下:
二进制:0和1
0 1 10
八进制:0 1 2 3 4 5 6 7
二、指针变量
/*指针变量:存放地址的变量。
语法:类型 *指针变量名;
赋值:指针变量名 = 地址;
在声明的时候初始化:类型 *指针变量名 = 地址;
例如:
int num = 20;
int *nump = #//存的是num的地址
打印指针变量:
printf("%p \n %p \n",nump,&num);
注意:定义指针变量,有如下几种方式:
1、类型 * 变量名 ;
2、类型* 变量名 ;
3、类型 *变量名 ;
以上三种都可以,* 代表一个特殊类型。
类型* 构成了类型*/
上面介绍了怎么去定义一个指针变量,下面介绍怎么使用它。
使用指针变量
语法:
*指针变量名;
语义:这就可以访问你所指向的那块空间里的值了
千万要注意:
访问指针变量时加星号和不加星号的区别:
int num;
int *p = #
1.加星号代表,是访问它所指向的空间里面的值。*p 相当于 num;
2.不加星号代表,是访问它自己的空间里面的值。p 就是自己里面存的值*///例如:intnum =10;
int*pNum;
pNum = #//注意:&不要省略!
printf("%d %d\n",num,*pNum); //所以也就是说,*pNum == num;*pNum =30;
printf("num=%d\n",num);//30
num =90;
printf("*pNum=%d\n",*pNum);
intnum =10;
int*pNum = #
(*pNum)++; //相当于num++ num=11
num +=20;
printf("num=%d\n",num);//31intnum =10;
int*pNum = #
int*pNum2 = pNum;
*pNum2 =30;
printf("num=%d *pNum=%d *pNum2=%d\n",num,*pNum,*pNum2);//30 30 30
一定要注意在使用指针变量的时候,加星号(*)和不加星号(*)的区别;同时指针变量也区别类型(区分类型是为了告诉指针,该去读取几个字节)。
什么类型的变量就用什么类型的指针去读取。
下面看一个例子:
intnum1 =10,num2 =20;
int*p1 = &num1;
int*p2 = &num2;
int*p3 = p2;
*p2 =40 ;
p2 = p1;
*p2 =30;
printf("num1 = %d num2 = %d *p1= %d *p2= %d *p3= %d ",num1,num2.*p1,*p2,*p3);
/*有兴趣的可以自己算下。*/
指针变量作为函数的参数:
/*语法:
返回值类型 函数名(指针类型* 指针变量名){
例如:
void test1(int* num){
int main(int argc,const char argv[]){
int num = 10;
test1(&num);
热门跟贴