指针:就是地址就是所谓的内存编号
指针变量:存放另一变量的地址(用来存放地址的)
本质是变量。
在32位(64位)平台任何类型的指针变量都占4字节(8字节)空间(char *p,int *p,short *p)
同一系统保存地址都是同一的大小。
学好指针变量必须弄懂俩个问题:int p
指针变量自身的类型;只需要把符号拖黑int *
//指针变量所指向的类型;
指针变量保存啥类型的地址:int
(把符号跟符号最近的拖黑 剩下的类型就是了)
这个地方的话,p=&num2.不能直接p=num2 因为数组名代表的是第0个元素的地址,这里的p的存放的是整体的首地址。
p = #指针变量p保存num的地址=p指向num;
*p用来取出num的值,就是代表p所保存的地址对应空间里面的值。可读可写//*p = num;
指针变量所取空间的内容的宽度是由所指向类型的长度决定 (把指针变量跟最近的*拖黑后的类型)
指针变量+1:p2+n p2跳过n个单位的宽度(单位宽度就是所指向类型的长度决定
三种字符串的存储方式:
1.数组形式存储和2.
字符串指针变量形式存储。字符串指针变量形式的开的是文字常量区。“hello”是字符常量
区别在于
hello是字符常量不能被修改。上面的代码//char *str =“xixixi”;不是指把xixixi赋值给str,是把
xixixi的第0元素的地址给str。
第三种方式:堆
1.初始化赋值:堆在存放字符串的时候不能初始化,只能使用strcpy、scanf赋值
//char *buf_heap;
buf_heap=malloc(20);
strcpy(buf_heap,“hell world”);
2.使用时赋值:字符数组:使用scanf或者strcpy
//strcpy(buf_aver,“hello”);
scanf(“%s”,buf_aver);
//char *str=NULL;
str = (char*)malloc(128);这个地方必须用str来接malloc的地址,不然会造成内存泄漏;
//申请后要知道申请的内存的地址,使用完后要free。
if(str == NULL)
{
perror(“malloc”);//因为从堆申请空间不是都能成功所以加上判断,失败就退出程序。
exit(0);
}
strcpy(str, “hello”);
str[0] =‘H’;
printf(“%s\n”,str);
free(str);//使用完堆要释放。