从之前看数据结构开始,就觉得自己的C语言基础很弱,对数据结构中的东西理解很吃力,直到19号晚上看到堆栈中的push和pop函数,在一个举一反三的例子中,涉及到了值传递与地址传递。才发现自己C语言学的完全不行。所以花了两天时间重新看了C语言中的指针和数组。现在做一个总结:
-指针的初始化(整型指针)
方法一:
int *p;
p = (int *)malloc (sizeof(int));
*p = 3;
//动态申请一个int(4个字节)大小的内存;记得使用完后必须free
方法二:
int *p,a;
p = &a;
*p = 3;
2.p指向a的地址 ;3.给p指向的地址赋值;即a所在的地方,a的值也会改变
方法三:
int a;
int *p = &a;
*p = 3;
方法三其实是方法二的改写,意思是一样的
错误方法:
int *p = 3;
int *p;
*p = 3;
1.错误的,此时p指向的地址是随机的
2.3./*同样是错误的,因为p是要指向3所在的地址,*p = 3 给p所指向的内存赋值,
但是p没有被赋值,所以p所指向的内存位置是随机的,没有初始化;*/
-指针的赋值
int *p;
int a;
int b[1];
p = &a;
p = b;
指针的赋值:“=”的左操作数可以使*p,也可以是p;
当左操作数是*p时,改变的是p所指向的地址存放的数据;(初始化时 int*p=0;意思是p指针为空)
当左操作数是p时,改变的是p所指向的地址
-字符串与指针的初始化和赋值
初始化:
char *p="zhangzhitong";
这是初始化过程,是将指针p指向字符串的首地址,而并不是传递字符串的值。因为在C语言中,没有整体处理字符串的机制
赋值:
char *p;
p="abcdef";
*p=”abcdef” ;//错误,字符串常量传递的是首地址,不可以通过*p来修改字符串的值,因为改字符串为常量,而它只是简单的将指针指向改字符串常量;
char 指针指向的数据不能修改具体原因见http://blog.csdn.net/on_1y/article/details/13030439
例子:
char *p = "zhuxinchen";
printf("%s\n",p);
printf("%c\n",*p); //必须为%c,不能为%s
输出为
zhuxinchen
z
其中的*p相当于p[0];
注意:(关于函数调用时使用字符串指针参数时,其实是将字符串的首地址赋值给形参数;)
-地址传递
void swap(int *p,int *q){
int temp;
temp = *p;
*p = *q;
*q = temp;
}
使用这个函数时需要传地址才会改变值;
例如:swap(&a,&b);
gets()函数的使用:
char str1[5]; //不要char*p,然后gets(p),这是错误的,因为p没有指向有效的内存,它可能指向任何非法地址 // 地方的未知大小的内存块,这样以来,就可能修改了不属于本程序的内存的内容
gets(str1);
printf("%s\n", str1);
return 0;
-补充与说明
char *p;
while(1){
p=malloc(1);
*p = 0;
}
这段代码存在问题:p的类型是什么?常见的c标准库的malloc函数,在空间不足的时候会返回0,(NULL)但是不会导致程序退出。
而对0地址写入的时候,会导致内存返回错误,从而使程序退出。
所以程序退出的时候不会提示说内存不足,而是说访问了不该访问的的内存。
但是这些说的话在不同的操作系统上是不同的;