C++指针,结构和联合

本文详细介绍了C++中的指针、结构和联合。通过实例展示了二维数组的定义,以及如何使用指针、流程控制语句(如for、while、do-while)、计算圆周率和立方根的算法。此外,还讨论了指针的用法,包括取地址运算符、间接运算符、const指针和引用,并解释了结构和联合的概念以及它们在定义和使用时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例:二维数组的定义;
#include <iostream.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system(“pause”) or input loop */

int main()
{
int b[2][3]={{1,2,3},{4,5,6}};
cout<<“数据元素b[0][0]值为”<<b[0][0]<<endl;

cout<<"数据元素b[0][3]值为"<<b[0][3]<<endl;

cout<<"数据元素b[1][1]值为"<<b[1][1]<<endl; 

cout<<"数据元素b[2][3]值为"<<b[2][3]<<endl;

b[2][3]=2.8; 

cout<<"数据元素b[2][3]值为"<<b[2][3]<<endl;

return 0;

}


数据元素b[0][0]值为1
数据元素b[0][3]值为4
数据元素b[1][1]值为5
数据元素b[2][3]值为0
数据元素b[2][3]值为2


Process exited after 0.01683 seconds with return value 0
请按任意键继续. . .

一:C++流程控制语句:
1.流程语句用于控制程序中各语句的执行功能,C++提供的流程控制语句有选择语句(if,switch),循环语句(for,while,do-while)和跳转语句(continue,break,goto,return)等三种语句;

例:输出十道减法题(for循环);
#include <iostream.h>
#include<stdlib.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system(“pause”) or input loop */
int main()
{
int a,b,t,i;
for(i=1;i<=10;i++)
{
a=rand();
b=rand();
if(a<b)
{
t=a;a=b;b=t;
}
cout<<a<<’-’<<b<<’=’<<endl;
}
return 0;
}


18467-41=
26500-6334=
19169-15724=
29358-11478=
26962-24464=
28145-5705=
23281-16827=
9961-491=
11942-2995=
5436-4827=


Process exited after 0.02377 seconds with return value 0
请按任意键继续. . .

##例:利用公式计算圆周率(while循环);
#include <iostream.h>
#include<math.h>
/* run this program using the console pauser or add your own getch, system(“pause”) or input loop /
using namespace std;
int main()
{
double sum=0,newdatum=1.0;
int n=1;
while(newdatum>1e-6)
{
sum=sum+newdatum;
n++;
newdatum=1.0/(n
n);

}
cout<<"pi is"<<sqrt(sum*6)<<endl;
	return 0;

}


pi is3.14064


Process exited after 0.02519 seconds with return value 0
请按任意键继续. . .
注:PII/6=1/11+1/33+…+1/NN,计算精度为1e-06;

##例:计算某数的立方根(do-while);
#include <iostream.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system(“pause”) or input loop */

int main()
{
double epsilon=1e-4;
double r=1.0,num,sign;
cout<<“Enter a number:”;
cin>>num;
do
{
r=(2r+num/(rr))/3;
sign=num/(rrr)-1.0;
if (sign<0) sign=-sign;
}while(sign>epsilon);
cout<<r<<endl;
return 0;
}


Enter a number:12
2.28943


Process exited after 2.866 seconds with return value 0
请按任意键继续. . .
注:若a是x立方根的近似值,那么b=(2a+x/(aa))/3是一个更好地近似值,该程序中采取迭代法,反复计算,直到满足给定的精度;

2.break语句和continue语句不能单独使用,需要和循环语句和switch语句结合起来使用;
2.1-break 标号:结束包围break语句的循环语句或者switch语句,跳到标号指向的语句继续执行;

例:计算两个整数的最大公约数;
#include <iostream.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system(“pause”) or input loop */

int main()
{
int m,n,temp;
cout<<“Enter two positive numbers:”;
cin>>m>>n;
if(m<n)
{
temp=m;
m=n;
n=temp;
}
do
{
temp=m%n;
m=n;
n=temp;
}while(n!=0);
cout<<“最大公约数是”<<m<<endl;
return 0;
}


ter two positive numbers:12 8
最大公约数是4


Process exited after 3.85 seconds with return value 0
请按任意键继续. . .
注:使用的算法是辗转相除法;

3.continue语句只能用于循环语句中,当在循环体内遇到continue语句中,它中断本次循环体的执行,立即执行下一次循环;
4.continue语句与break语句不同,break语句是退出循环。continue语句是结束本次循环,continue语句后面的语句不被执行,继续下一次循环;
5.goto语句是循环语句的起源;
二:指针:
1.指针通常指的是一个数据的地址,C++中规定了数据类型及其每一种数据类型所占用的存储单元的个数,像字符char型数据占用一个存储空间(一个地址),而双精度double型数据就要占用8个存储空间;
2.指针变量是存储指针(地址)的变量,在程序中若要引用指针变量,必须要先定义后使用:int *pointer;
3.char *zfp=“xyz”,*zfp1=zfp;这条语句定义了两个字符指针变量zfp1和zfp,且将zfp初始化为字符串常量“xyz”所在存储器空间的首地址,指向字符串“xyz”;对zfp1进行了初始化,使zfp和zfp1有了同一个地址值;
4.取地址运算符&和间接运算符
例:
#include <iostream.h>
using namespace std;
/
run this program using the console pauser or add your own getch, system(“pause”) or input loop */

int main()
{
int x=10,*pointer;

pointer=&x;

cout<<"x="<<x<<endl;

cout<<"*pointer="<<*pointer<<endl;

*pointer=20;

cout<<"x="<<x<<endl;

cout<<"*pointer="<<*pointer<<endl;

return 0;

}


x=10
*pointer=10
x=20
*pointer=20


Process exited after 0.01218 seconds with return value 0
请按任意键继续. . .
注:指针必须指向一个与其类型相一致的对象;

5.C++提供了许多用于处理字符串的函数,这些函数都包含在头文件string.h中5.1-求字符串长度函数strlen(),其中字符串的结束标志不计算在内;
5.2-字符串的拷贝函数strcpy(字符串1,字符串2);
5.3-字符串的连接函数strcat(字符串1,字符串2);
5.4-字符串的比较函数strcmp(字符串1,字符串2),当完全相同时返回0,1大于2时返回一个大于0的整数,1小于2时返回一个小于0的整数;

6.const和指针一起用需要注意的问题:
6.1-如果在定义指针变量时增加const,则要把指针变量定义成常值指针变量,这种指针变量不能改变指向:
int x=10,y=4;
const int *pr=&x;
pr=&y;//出错
6.2-不能通过常值指针变量改变所指对象的值;
int x=10;
const int *pr=&x;
*pr=20;//错误,pr是常值指针变量
x=20;//正确
*(int *)pr=20;正确,通过强制类型转换改变目标单元的内容
6.3-可将两者都设为常值变量const;
const int x=10;
const int *pr=&x;
6.4-可变指针不能指向不变数据,但可以通过强制类型转换取消限制;
const int j=1999;
int *pointer;
pointer=&j;//错误,可变指针不能指向不变数据

const int j=1999;
int *pointer;
pointer=(int *)&j;//正确
*pointer=20;
cout<<*pointer<<endl;//输出数据为20
cout<<j<<endl;//输出数据为1999

7.引用与指针:
7.1-为变量取得别名称为引用:数据类型&变量2=变量1;其中&为引用运算符,变量2为变量1取的别名,且他并不是一种单独的数据类型,必须同其他数据类型结合起来使用;
int x;
int &y=x;//别名y其实是变量x的地址
例:
#include <iostream.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system(“pause”) or input loop */

int main()
{
int a=9;

int &b=a;

cout<<"Here a="<<a<<"\n";

cout<<"Here b="<<b<<"\n";

a++;

cout<<"Here a="<<a<<"\n";

cout<<"Here b="<<b<<"\n";

return 0;

}


Here a=9
Here b=9
Here a=10
Here b=10


Process exited after 0.01483 seconds with return value 0
请按任意键继续. . .

二:结构
1.结构类型的定义:
struct 结构名称
{
成员类型 成员1;
成员类型 成员2;
成员类型 成员3;
.
.
.
成员类型 成员n;
};

2.使用结构:一旦定义了结构,就可以把它作为一种数据类型,然后用来定义变量,将变量定义成结构类型可采用以下两种格式:
struct 结构名称 变量名;//C的书写方式
结构名称 变量名;//C++的书写格式
也可以在定义结构的同时定义变量:
struct student
{
char sex;
int age;
}student3,student4;
3.结构成员的存取:对结构中的每个成员进行存取操作,可以使用圆点操作符“.”,格式为:结构变量名.结构中的成员名
4.结构指针的定义和使用:
结构指针是指向结构的指针,其定义格式为:结构类型 *指针名;
通过结构指针访问结构成员的格式为:结构指针变量->成员名;
5.在C++中,可以将函数加入到结构中,这样,结构中不仅可以包含多个数据成员,还可以包括一些功能或操作;
三:联合:
1.联合是一种用户自定义的数据类型,其定义形式与结构类型的定义相似,它是由若干个数据成员组成,也可以带有成员函数,二者的不同在于:在任一时刻,结构中的所有成员都是可以进行访问的,而联合中的成员则是只有一个是可以访问的,其余所有成员都是不可访问的;
2. 每个联合对象所占用的存储空间的大小等于所有数据成员所用存储器空间中的最大值,相当于多个变量共享一块存储空间;
3. 联合的定义:
union 联合名称
{
成员类型 成员1;
成员类型 成员2;
成员类型 成员3;
.
.
.
成员类型 成员n;
};
4.联合的使用:将变量定义成联合类型可采用以下两种格式:
union 联合名称 变量名;//C的定义格式
联合名称 变量名;//C++的定义格式
通常也可以在定义联合的同时定义变量;
5.联合成员的存取,定义与使用联合指针的方式都与结构相同;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值