C语言基础之指针与数组

从之前看数据结构开始,就觉得自己的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地址写入的时候,会导致内存返回错误,从而使程序退出。
所以程序退出的时候不会提示说内存不足,而是说访问了不该访问的的内存。
但是这些说的话在不同的操作系统上是不同的;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值