铁律1:指针是一种数据类型
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)指针是一种数据类型,是指它指向的内存空间的数据类型
含义1:指针步长(p++),根据所致内存空间的数据类型来确定
p++=è(unsigned char )p+sizeof(a);
结论:指针的步长,根据所指内存空间类型来定。
多级指针做函数参数的理解
//在函数调用哪个的时候 实参的值机械的传给形参(c int数组场景)
//关于形参:
写在函数上形参变量,还是写在函数里面的变量,
从CC++编译的角度来讲,是没有任何区别的(分配4字节内存);
只不过是 写在函数上形参变量 ,具有对外的属性而已/*
int getbuf01(char *p); int getbuf01(char* p);
int getbuf02(char **p); int getbuf02(char* *p); getbuf02(char ** p);
int getbuf03(char (*p)[]); intgetbuf03(char (*p) []); int getbuf03(char ( *p)[ ]);
int getbuf03(char p[10][30]);
int getbuf04(char *****p);
*/
//角度1站在c++编译器的角度 指针就是一个变量,除此之外啥也不是!
//不管是1个* 还是8个*对c++编译器来讲,只会分配4个字节内存
//角度2:当我们程序员要使用指针所指向的内存空间的时候,我们关心,这个内存块是一维的,还是二维的。C和java的堆栈区别
[ ]*的本质
//[]*的本质到底是什么?
//*p是我们程序员手工的(显示)去利用间接赋值
//【】 只不过是,c/c++ 编译器帮我们做了一个*p的操作。。。。。。
//buf4[i]======> buf4[0+i] ====> *(buf4+i)
//===*(buf4+i) --> bu4[i];//操作数组的方法
//下标法和指针法
void main()
{
int i = 0;
char *p = NULL;
//通过字符串初始化字符数组 并且追加\0
char buf4[] = "abcd";
for (i=0; i<strlen(buf4); i++)
{
printf("%c", buf4[i]); //p[]
}
//[] *的本质到底是什么?
//*p 是我们程序员手工的(显示)去利用间接赋值
//【】 只不过是,c/c++ 编译器帮我们做了一个*p的操作。。。。。。
// buf4[i]======> buf4[0+i] ====> *(buf4+i)
//===*(buf4+i) --> bu4[i];
printf("\n");
p = buf4;
for (i=0; i<strlen(buf4); i++)
{
printf("%c", *(p+i)); //*p
}
system("pause");
}
为什么int a[10] a是个常量
{
int a[10]; //a是一个指针===》a常量指针===》为什么c++
int *p = a;
p ++;
a ++;
}
//c++编译器要拿着a去析构内存,为了避免你把a的指向改变。。。。。