指针(基础)

地址和指针

  • 指针名和数组名都代表内存地址,不同的是,指针名是一个变量,而数组名是一个常量。
  • 在定义数组时,编译器必须分配及地址和足够的存储空间,以存储数组的所有元素 eg: int a[100],*p; p=a;等价于p=&a[0]; p=a+1等价于p=&a[1]其中p=a+1是合法的,a=a+1是非法的
sum=0;
for (p=a;p<=&a[99];p++)
	sum+=*p;
*(a+i)等价于a[i]
for(i=0;i<100;i++)
	sum+=*(a+i);	
for(i=0;i<100;i++)
	sum+=a[i];
for(i=0;i<100;i++)
	sum+=p[i];数组名可以用指针的形式,指针名可以用数组的形式
  • 如果p是指向某个指定类型变量的指针,该值表示在p和q之间的数组元素的个数,指针每一次加1减1,并非指针的值加1或减1,而是加上或减去该指针所指向的那个变量数据类型的长度,即他所指向的存储单元所占用的字节数。
  • 两个指向同一个数组的指针相减,表示它们之间相隔的数组元素的数目
  • 两个相同类型的指针还可以比大小,pa<pb为真
int a[10]={1,2};
int *pa,*pb;
pa=a;
pb=a+1;
cout<<pa-pb<<endl;
cout<<pb-pa<<endl;//pb-pa的值是int型的值

字符串和字符指针

字符串常量

字符串常量是用一对双引号括起来的字符序列,与基本类型常量的存储相似,字符串常量在内存中的存放位置由系统自动安排,由于字符串常量是一串字符,通常被看作一个特殊的一维字符数组,字符串常量实质上是一个指向该字符串首字符的指针常量,字符串“hello”的值是一个地址,从他指定的存储单元开始连续存放该字符串的6个字符。

char *p="Hello World!";
char ch[]="welcome to cpp!";
printf("%s","Hello World");//输出Hello World
printf("%s\n","Hello World"+1);//输出ello World
printf("%s\n",ch+1);//输出elcome to cpp!
  • 如果要改变char型数组所代表的字符串,只能改变数组元素的内容,如果熬改变指针p所代表的字符串,通常直接改变指针的值,让它指向新的字符串,p是指针变量,它的值可以改变,指向其他单元。
  • 可以对char型数组的内容通过strcpy()函数进行修改,但是不能直接赋值,因为ch是一旦声明不能更改的(数组名是常量)。
  • 可以对char型指针赋值eg:p=“hello”;
char ch[]="hello";
strcpy(ch,"hi");
cout<<ch<<endl;
p="hello";
  • 定义字符指针后,如果没有对他赋值,指针的值是不确定的,不能明确他指向的内存单元,因此,如果引用未赋值的指针,可能出现难以预料的后果。为了尽量避免引用未赋值的指针所造成的危害,在定义指针时,可先将它的初始值置为空,eg: char *s=NULL;
chat *s;
cin>>s;//这种做法是危险的
char *s,str[20];
s=str;
cin>>s;//合法

常用的字符串处理函数

  • gets() puts()字符串的输入输出 gets()函数从输入得到一个字符串,遇到回车输入结束,自动将输入和的数据和‘\0’送入数组 允许字符串带空格 puts() 输出时遇‘\0’自动将其转换为’\n’换行符
  • char* strcpy(char *s1,char *s2); 字符串复制函数
  • strcat(s1,s2)字符串连接函数,参数s1必须是字符数组基地址,参数s2可以是字符数组名or字符串常量
  • strcmp(s1,s2)字符串比较函数;若s1和s2相等,返回0;s1>s2返回一个正数;s1<s2返回一个负数
  • strlen(s1)字符串长度函数

动态内存分配

每次动态分配内存都必须检查是否分配成功

  • 了解需要多少内存空间
  • 利用动态内存分配函数来分配所需要的存储空间
  • 是指针指向获得的内存空间,以便用指针在该空间内实施运算或操作
  • 当使用完毕内存后,释放这一空间。
if((p=(int*)malloc(n*sizeof(int)))===NULL){
	printf("Not able to allocate memory.\n");
	exit(1);
}
if(p=(int*)calloc(n,sizeof(int))==NULL){
	printf("Not able to allocate memory.\n");	
	exit(1);
}
  • malloc()和calloc()的区别,malloc()对所分配的存储块不做任何事情,calloc()对整个区域进行初始化。申请成功则返回一个指向被分配存储空间的起始地址的指针,若申请不成功,则返回NULL(0)
  • free()动态存储释函数:释放由动态存储分配函数申请到的整块内存空间
  • void* realloc(void* ptr,unsigned size)分配调整函数,更改以前的存储分配
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值