第六章 指针和基于指针的字符串

第六章   指针和基于指针的字符串

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
 
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值