指针和数组
指针和数组:
数组拥有很多个地址,每个地址对应一个元素。
数组的名字其实也是一个指针(指向数组的基地值,即第一个元素的地址)
int *ptr1 = &myArray[0];
int *prt2 = myArray;
这两句其实是一个意思。
如果想通过指针访问其他数组元素应该怎么办:
即为ptr1++ 不仅仅是地址加1,你得看数据类型,比如int就是加4个字节的地址
/*指针:C语言的灵魂*/
/*
想了解指针需要先了解地址,程序在硬盘上以文件的形式存在,但它们的运行却是计算机的内存里发生的
对齐:C++中根据自然边界进行对齐。
指针是用来存放地址的变量,它只保存地址,但不保存那个值,
所以必须确保指针对应一个已经存在的变量或者一块已经分配了的内存
*号有两个用途
1.创建指针变量type *pointerName
2.对指针进行了解引用
3.指针是可以多个指向一个变量的地址的,一个改变其他都改变
例如:
int *p;
int pp = 123;
p = &pp;
int *p1, *p2, *p3
void* p1(这个是不确定指针类型,具体使用的时候直接转换一下,如(int*)p1)
*/
/*单引号是单个字符,双引号是字符串*/
/*
struct c
{
int a;
char b;
};
cout << sizeof(c) << endl;
return 0;占八个内存
*/
/*
创建变量时,系统将分配一些内存块用来保存它们的值;每个内存块拥有独一无二的地址;
利用指针改变值:
用*来取指针的值,可以修改这个值来修改它指向的那个数据的值(地址存放的数据而不是地址)
*/
#include <iostream>
using namespace std;
int main()
{
}
/*
指针和数组:
数组拥有很多个地址,每个地址对应一个元素。
数组的名字其实也是一个指针(指向数组的基地值,即第一个元素的地址)
int *ptr1 = &myArray[0];
int *prt2 = myArray;
这两句其实是一个意思。
如果想通过指针访问其他数组元素应该怎么办:
即为ptr1++ 不仅仅是地址加1,你得看数据类型,比如int就是加4个字节的地址
*/
#include <iostream>
using namespace std;
int main()
{
const unsigned short ITEMS = 5;
int intArray[ITEMS] = {1, 2, 3, 4, 5};
char charArray[ITEMS] = {'F', 'I', 'S', 'H', 'C'};
int *intPtr = intArray;
char *charPtr = charArray;
cout << "整数型数组输出:" << '\n';
for(int i = 0; i < ITEMS; ++i)
{
cout << *intPtr << " at " << reinterpret_cast<unsigned long>(intPtr) << '\n';
intPtr++;
}
cout << "字符型数组输出:" << '\n';
for(int i = 0; i < ITEMS; ++i)
{ /*地址格式强制转变,才能输出每一个元素占的地址*/
cout << *charPtr << " at " << reinterpret_cast<unsigned long>(charPtr) << '\n';
charPtr++;
}
return 0;
}
#include <iostream>
using namespace std;
void print(int *pBegin, int *pEnd)
{
while(pBegin != pEnd)
{
cout << *pBegin;
pBegin++;
}
}
void print(char *pBegin, char *pEnd)
{
while(pBegin != pEnd)
{
cout << *pBegin;
pBegin++;
}
}
int main()
{
int num[5] = {1,2,3,4,5};
char ch[5] = {'h', '1', '2', '3', '4'};
print(num, num + 5);
cout << endl;
print(ch, ch + 5);
cout << endl;
return 0;
}
模板
因为数据类型太多了,这里直接用模板进行重载会好很多,模板写法如下:
#include <iostream>
using namespace std;
/*用模板进行重载*/
template <typename T>//模板template
void print(T *pBegin, T *pEnd)
{
while(pBegin != pEnd)
{
cout << *pBegin;
pBegin++;
}
}
int main()
{
int num[5] = {1,2,3,4,5};
char ch[5] = {'h', '1', '2', '3', '4'};
print(num, num + 5);
cout << endl;
print(ch, ch + 5);
cout << endl;
return 0;
}
结构
对象的基础:结构
贯穿于C++的核心:对象
结构structure是一种由程序员定义的,由其他变量组合的数据类型
typedef struct name
{
type varName1;
type varName2;
}NAME;
记得加分号!用typedef重命名,可以定义的时候不加struct name,而是直接NAME。当需要处理一些具有多种属性的数据时,结构往往是很好的选择。
例如:当我们编写管理员程序,涉及到的基本特征有:姓名、身份证、性别。
/*对象的基础:结构*/
/*贯穿于C++的核心:对象*/
/*结构structure是一种由程序员定义的,由其他变量组合的数据类型*/
/*
typedef struct name
{
type varName1;
type varName2;
}NAME; ,记得加分号!用typedef重命名,可以定义的时候不加struct name,而是直接NAME
*/
/*
当需要处理一些具有多种属性的数据时,结构往往是很好的选择
例如:当我们编写管理员程序,涉及到的基本特征有:姓名、身份证、性别。
*/
#include <iostream>
using namespace std;
typedef struct FishOil
{
string name;
string uid;
char sex; /*F == Female. M == Male*/
}FISHOIL;
int main()
{
FISHOIL Jiayu; /*创建了一个FileOil结构类型*/
/*对结构成员进行赋值*/
Jiayu.name = "小甲鱼";
Jiayu.uid = "fishc_00000";
Jiayu.sex = 'M';
/* 可以这样直接赋值:FISHOIL Jiayu = {"小甲鱼", "fishc_00000", 'M'} */
return 0;
}
/*结构和指针*/
/*指针无所不能,可以指向结构,我们需要学习如何通过指针解引用来访问结构中的各个成员*/
/*
FISHOIL *pJiayu = &Jiayu
(*pJiayu).name = "黑夜" 这就是解引用,并改变值
第二种解引用
pJiayu->name = "黑夜"
pJiayu->uid =
当成结构变量的时候(解引用)的时候,用. 如果当成一个指针就用->,指针直指哦!
*/
/*
课后练习
- 定义一个结构,至少存储:姓名、身份证、性别
- 实现文件存储
- 可以打印到屏幕
*/