第六章 指针和基于指针的字符串
1. 指针运算符-互为反运算
地址运算符-&,返回操作数的内存地址
间接运算符-*,返回指针操作数所指向的对象的同义词=间接引用运算符
2.选择排序
#include <iostream>
using namespace std;
#define size 5
//选择排序
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void selectionSort(int a[])
{
int min;
for(int i=0;i<size;i++)
{
min=i;
for(int j=i+1;j<size;j++)
{
if(a[j]<a[min])
{
min=j;
}
}
swap(&a[i],&a[min]);
}
}
void main()
{
int a[size];
for(int i=0;i<size;i++)
cin>>a[i];
selectionSort(a);
for(int i=0;i<size;i++)
cout<<a[i]<<endl;
}
3.sizeof运算符-确定程序编译期间数组/其他数据类型/变量/常量的字节大小
Sizeof(char)=1 short=2, int =4, long=4, float=4, double=8, longdouble =8
Int array[20] ----- sizeof array=80; 是变量不用加括号
4.字符串处理
所有字符串操作函数的参数都是char *strcpy(char *s1,const char*s2);
#include <iostream>
#include <string>//不用<cstring>
using namespace std;
void main()
{
string s1="abcdef";
string s2="gh";
string s3=s1+s2;//string 比较直接是运算符
//cout<<"string "<<s3<<endl;
char c1[7]="abcdef";//char的末尾多一位字符\0,终止空字符
char c2[7];
char c3[4];
strcpy(c2,c1);//把c1复制到c2
cout<<"char[] strcpy复制 "<<c2<<endl;// 输出为abcdef
strncpy(c3,c1,3);
c3[3]='\0';//必须加上,终止空字符不能被复制
cout<<"char[] strncpy1 "<<c3<<endl;//abc
char c4[20]="happy";
char c5[]=" new year";
char c6[7]="";//或者不加终止空字符,在初始化时直接双引号
strcat(c4,c5);//把c5追加到c4后面
cout<<"char[] strcat追加 "<<c4<<endl;//happy new year
strncat(c6,c4,5);//把c4追加到c6后面
cout<<"char[] strncat "<<c6<<endl;//happy,若初始c6="3"--3happy
char c7[]="happy";
char c8[]="happy";
cout<<"char[] strlen() "<<strlen(c7)<<endl;//5-字符串长度不包括终止字符
cout<<"char[] strcmp 比较-值为-1/0/1 "<<strcmp(c7,c8)<<endl;//0表示相等
char *s4="happy";
char *s5="haapy";
cout<<"char* strlen() "<<strlen(s4)<<endl;//5
cout<<"char* strcmp 比较-值为-1/0/1 "<<strcmp(s4,s5)<<endl;//1
cout<<"char* strncmp 比较 返回差值 "<<strncmp(s4,s5,4)<<endl;//15
char c9[]="I am happy";
cout<<"未分隔之前char[] "<<c9<<endl;//I am happy
char *c10;
c10=strtok(c9," ");//必须返回的是可修改的值类型,即指针
//分行打印出
while(c10!=NULL)
{
cout<<" strtok "<<c10<<endl;
c10=strtok(NULL," ");//记号化-strtok用空字符替换了空格,将null作为它的第一个参数,若无剩余的记号,strtok返回null
}
cout<<"分隔之后char []"<<c9<<endl;//I
}
5.
/*
3. 定义字符串数组。charstr[256];实现以下函数。
a) 数组接受键盘输入。
b) 计算字符串的长度。(使用数组名访问方式)
c) 计算字符串的长度。(定义一个char*p;借助指针)
d) 反转这个字符串。(原型 voidInverse(const char*, char*));
*/
#include <iostream>
#include <string>
using namespace std;
int strLength(char a[])
{
int i=0;
//用while可以不用知道大小
while(a)
{
if(a[i]=='\0')
break;
i++;
}
return i;
}
int strLength2(char *p)
{
int i;
//用for也行
for(i=0;p[i]!='\0';i++)
;
return i;
}
void Inverse(const char *a,char *b)
{
int i=0;
int n=strlen(a);//长度不包括终止空字符还需要多+1
for(int i=0;i<=n;i++)//所以这块<=n
{
b[n-i]=a[i];
}
for(int j=0;j<=n;j++)
cout<<b[j]<<" ";
}
void main()
{
char str[256];
const char str1[256]="happy";
char str2[256];
cin>>str;
cout<<"字符串长度"<<strLength(str)<<endl;
cout<<"字符串长度"<<strLength2(str)<<endl;
//cout<<"系统自带计算字符串长度"<<strlen(str)<<endl;
Inverse(str1,str2);
}
6.数组与指针
数组其实就是指针,都是指向首地址,前两个对首地址求*,返回第一个值,所以前面是a
#include <iostream>
using namespace std;
char* get_str(char str[])
{
//局部变量,函数运行完就销毁了数组
return str;
}
//函数调用完指针不会销毁
char *get_str1()
{
char *str="abcd";
return str;
}
void main()
{
char str[]="abcd";
cout<<get_str(str)<<endl;//有误
cout<<*get_str(str)<<endl;//a
cout<<*get_str1()<<endl;//a
cout<<get_str1()<<endl;//abcd
}
数组和指针区别和联系:
数组只是定义在栈区的一个连续变量,它的首地址就是一个指针。
区别:数组在它的定义域内知道长度,指针不知道数据长度
#include<iostream>
using namespace std;
#include<stdio.h>
void main()
{
char a[10] ="clsqiqi";
char *p;
p = a;
cout<<a<<" "<<p<<endl;
cout<<*(p+2)<<" "<<p[2]<<endl;
cout<<&p[2]<<" "<<p+2<<endl;
cout<<&p<<" "<<&a<<endl;
cout<<&p[0]<<" "<<&a[0]<<endl;//cout做了一个封装
//cout应该是封装好的输出方法
printf("%X %X %X %X\n", &p, &a,&p[0], &a[0]);//%X-16进制 &p-p指针所在的位置,&p[0]对"c"的地址
printf("%X %X %X %X\n", &(*p),&a, &p[0], &a[0]);
//指针本身就占用--4字节
//数组属于常量指针
}
//指针内存占了4位,数组内存是按照内容大小来的
void main()
{
char p[]="123456";
char*q="123456";
cout<<sizeof(p)<<endl;//7
cout<<sizeof(q)<<endl;//4
}