###################################################################################################
Chapter_4
指针
指针变量,指针常量(指针常量就是变量的地址)
指针本身是个地址量,类似100a
使用100a访问变量内存是直接访问
使用指针是间接访问
指针也是一种数据类型,它存储的是地址
指针可以指向任何的数据类型&函数
命名:
<存储类型><数据类型> * pa;
char *pa;
static int *px;
初始化:
int a[5];
int*pa=&a[4];
char cc;
char *pc=&cc;
注意:标准C不允许使用 int *point=1000; //标准C语言 不允许赋整型值,某些嵌入式开发的可以这么干
取地址符&: >>数据类型增加一级
不允许取数组名,常量,寄存器变量
取内容符*: >>数据类型降低一级
注意:
二级指针就是一级指针变量的地址。
int * pc;
int ** pc=&p;
指针本身大小:
near型指针:两个字节
far型指针:四个字节
void指针:
<存储类型> void * 指针变量名; //无类型指针
指针的运算
1.指针的算术运算
p1++,p1+2,++p1,p1--,p1-2,--p1,p1-p2
注意不同数据类型指针地址量变化 sizeof(*p) //注意这不是sizeof(p) //因为near类型的都是两个字节
char*p1;
p1++; 多一个地址
int*p1;short *p1;等等
p1++;多两个地址
运算优先级
*和++是优于=的,但是规则是从右到左 y=*(px++)
标准函数库里面字符串复制函数源码
char * strcpy(char *dest, char *src)
{
char*temp=dest;
while((*temp++=*src++)!='\0');
return temp;
}
2.指针的关系运算
p1<p2 返回值为1 反之为0 ?什么是指向后方的指针大于指向前方的指针
p==0 p!=0 判断是不是空指针
3.指针的赋值运算
1.char c, *pc; //变量地址赋予指针
pc=&c;
2.int *p,*q; //一个指针值赋予另一个相同数据类型的指针
…q指向一个目标
p=q;
3.char name[20]; //数组地址赋予相同数据类型指针
char *p;
p=name; //p=&name[0]; //数组名是一个地址常量,不允许对数组名赋值
4.动态内存分配技术
#include<stdlib.h>
#include<alloc.h>
函数原型
void *malloc(unsigned size)
void free(void *ptr)
#include<stdio.h>
#include<stdlib.h>
#include<alloc.h>
#include<string.h>
void main()
{
char *str;
//这两个都可以
//if(!(str=(char*)malloc(10*sizeof(char))))
if ((str=(char *)malloc(10*sizeof(char)))==NULL) //malloc函数返回空指针,所以需要(char *)强制类型转换一下
{
printf("not enough memory to allocte bufer\n");
exit(1);
}
}
指针和数组:
int a[10];
int *pa;
如果我们进行了赋值操作
pa==a;//或者是 pa=&a[0];
那么
a[i],pa[i],*(pa+i),*(a+i) 都是一样的
注意,数据类型上,数组名是地址常量,此处的指针是一个变量
指针和字符串:
字符串是字符指针常量
C语言经常使用char 型指针来处理字符串,因此char型指针也称之为字符指针
1. 字符串常量初始化字符指针
char *pc;
pc="c_program"
2. 程序中使用字符串赋给一个指针
注意scanf使用的这个pa必须先赋值或者先定义
char str[80];
scanf("%s",pa); //将输入的字符放到指针pa指向的地址中
printf("%s",pa);
char *p;
p="c_programming_language"; //系统先开辟一块内存存储这个字符串,然后将首地址赋予指针
指针数组:
int *point[10];
int data[2][3];
//data 赋值
for(i=0;i<10;i++)
{
point[i]=data[i];
}
data[i][j] pdata[i][j]
*(data[i]+j) *(data[i]+j)
*(*(data+i)+j) *(*(data+i)+j)
意思都是一样的,但是注意赋值方式
使用指针常见的错误:
1. 这个是scanf原理错误,将输入的字符串存到指针所指向的位置
char *p;
scanf("%s",p);这个是错误的!
2. 输入超过长度
char str[10];
scanf("%s",str);
3. char *p="TurboC++";
strcpy(p,"BorlandC++");
也会出现类似的问题