1、指针也是一种数据类型
指针是一种数据类型,是指它指向的内存空间的数据类型;
*号表示 操作 指针所指向的内存空间中的值;
*p相当于通过地址(p变量的值)找到一块内存;然后操作内存;
*p放在等号的左边赋值(给内存赋值);
*p放在等号的右边取值(从内存获取值);
不断的给指针变量赋值,就是不断的改变指针变量(和所指向内存空间没有任何关系);
指针做函数参数 形参有多级指针的时候, 站在编译器的角度 ,只需要分配4个字节的内存(32bit平台),当我们使用内存的时候,我们才关心 指针所指向的内存 是一维的还是二维的。
2、指针指向某个变量,就是把某个变量地址赋给指针;
指针变量 和 它指向的内存块变量 是两个不同的概念;释放了指针所指的内存空间,但是如果指针变量没有重置成NULL,则会出现“野指针”的情况。
避免方法:(1)定义指针的时候,初始化成NULL;(2)释放指针所指向的内存空间以后,紧接着把指针重置成NULL。
3、一级指针的典型用法:数组 int buf[10]、字符串
1).C语言的字符串 以零结尾的字符串
2).在C语言中没有字符串类型, 通过 字符数组 来模拟字符串
3).字符串的内存分配,堆上、栈上、全局区 (很重要)
4).注意:buf是一个指针,是一个只读的常量,也就是说buf是一个常量指针,不能别修改指向(也就是地址)。——这是必须的,也是显而易见的,为了保护数组的首地址,析构内存的时候,保证buf所指向的内存空间安全释放
p = buf; //buf 数组首元素的地址
for (i=0; i
{
p = p +i;//此处不能换成buf,这也是数组首地址和指针的区别
printf("%c ", *p);
}5).字符串作函数参数
//不要轻易改变形参的值, 要引入一个辅助的指针变量. 把形参给接过来
int copy_str26_good(char *from , char *to)
{
//*(0) = 'a';
char *tmpfrom = from;
char *tmpto = to;
if ( from == NULL || to == NULL)
{
return -1;
}
while ( *tmpto++ = *tmpfrom++ ) ; //tmpfrom在不断变化! //空语句
printf("from:%s \n", from); //打印成功!from未变化!
}
int main()
{
int ret = 0;
char *from = "abcd";
char buf2[100];
copy_str