1、指针也是一种变量,占用内存空间,用来保存另一个变量的内存地址。
2、*p操作内存
在指针声明时,*表示所声明的变量为指针。
在指针使用时,*表示操作指针所指向的内存空间中的值。
*p相当于通过地址(p变量的值)找到一块内存,然后操作内存。
*p放在等号左边为赋值(给内存赋值)
*p放在等号右边为取值(从内存获取值)
3、指针变量和它指向的内存块是两个不同的概念。
不断的给指针赋值,相当于不停的改变指针的指向。
(1)给p赋值 p=0x1111; 只会改变指针变量值,不会改变所指向的内容
如 p=p+1; p++;
(2)给*p赋值 *p='a'; ,不会改变指针变量的值,只会改变所指向的内存块的值。
(3)=左边*p表示给内存赋值,=右边*p表示取值,含义不同切记!
(4)=左边 char *p
(5)保证所指的内存块能修改
4、指针也是一种数据类型,是指它指向的内存空间的数据类型。
指针步长(p++),根据所指内存空间的数据类型来确定。
结论:指针的步长,是根据所指内存空间类型来确定的。
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
char *getStr()
{
char*tmp=NULL;
tmp ="abcdefg"; //指针tmp指向常量abcdefg
returntmp;
}
//int getABC1(char*p1); intgetABC1(char* p1);
//int getABC2(char** p2); int getABC2(char* *p2); int getABC2(char **p2);
//int getABC3(char***p3);
//int getABC4(char(*p4)[30]); intgetABC4(char (*p4) [30]);
//int getABC5(charp5[10][30]); intgetABC5(char p5[10][30]);
//指针做函数参数 形参有多级指针的时候,站在编译器的角度,只需要分配4个字节的内存(32bit平台)
//当我们使用内存的时候,我们才关心指针所指向的内存,是一维的还是二维的
void main()
{
inta = 10;
char *p1 = 100; //可以将100赋给指针变量,即告诉编译器分配4个字节的内存
char****p2 = 100;
int*p3 = NULL;
printf("a:%d, p1:%d , p2:%d\n",sizeof(a),sizeof(p1),sizeof(p2));
p3= &a;
*p3 = 20; //间接的修改a的值
// *就像一把钥匙,通过一个地址(&a),去修改a变量的值
{
intc=0;
c=*p3;
printf("c:%d\n",c);
}
{
char*p4=NULL;
p4= (char *)malloc(100);
}
{
char*p=getStr();
printf("p:%s\n",p);
//*(p+2)='r'; //*(p+2)表示常量区的第三个元素,常量不能被修改
//因此,要修改指针指向的内存块,首先要保证可以被修改,即为变量区
}
printf("sssss\n");
system("pause");
}