标签:9.png 静态存储区 数组名 表示 地址 static strlen space 函数
一、指针的定义和初始化
#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
int main()
{
int a=0; //变量a
int *p=&a; //指针p指向变量a的地址
cout<<"p指向的地址为:"<<p<<endl; //p是地址
*p=1; //*p是p地址上的数据
cout<<"修改了*p为1后,a的值为:"<<a<<endl;
int b=*p; //b等于p地址上的数据
cout<<"b的值为:"<<b<<endl;
int *q=p; //q指针,指向了p指针
*q=2; //改变q指针的数据,也就改变了p指针的数据,也就是改变了a;
cout<<"修改了*q为2后,a的值为:"<<a<<endl;
}

指针中* 是间接运算符,可以利用指针访问变量。
二、指针运算
指针与指针相减表示两个指针间可以存储的变量的个数。
指针加减某个整数,相当于将指针移动整数个变量大小。
#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
int main()
{
double f;
double *pf1=&f;
double *pf2=pf1+1;
cout<<"pf1="<<pf1<<endl;
cout<<"pf2=pf1+1,pf2="<<pf2<<endl;
cout<<"pf2-pf1="<<pf2-pf1<<endl;
}

double 占8个字节,0x30-0x28=16-8=8 正好是加整数1,位置移动了8个字节。
三、指向数组的指针
1、
#include<iostream>
using namespace std;
int main()
{
int ary[10]={0,1,2,3,4,5,6,7,8,9};
int *p=&ary[0];
cout<<"p指向的地址为:"<<p<<" 该地址上的数据为:"<<*p<<endl;
int *q;
q=&ary[0];
cout<<"q指向的地址为:"<<q<<" 该地址上的数据为:"<<*q<<endl;//这两种方法和指向数据的定义和初始化的方法一样
int *m;
m=ary;
cout<<"m指向的地址为:"<<m<<" 该地址上的数据为:"<<*m<<endl;
int *n=ary;
cout<<"n指向的地址为:"<<n<<" 该地址上的数据为:"<<*n<<endl; //这两种方法是由于数组名代表的就是数组的首地址,直接让指针等于数组名就可以了。
}

注意p、&arr[0]、arr都代表了同一个地址,但p是变量指针,可以修改,而后两个不可以修改。
2、用数组名代表首地址,指针移动输出
#include<iostream>
using namespace std;
int main()
{
int ary[10]={0,1,2,3,4,5,6,7,8,9};
for(int i=0;i<10;i++)
cout<<*(ary+i)<<" ";//利用数组名代表首地址,指针移动输出
cout<<endl;
}

3、反转数组
#include<iostream>
using namespace std;
int main()
{
cout<<"利用指针反转数组"<<endl;
cout<<endl;
int ary[10]={0,1,2,3,4,5,6,7,8,9};
cout<<"反转前:"<<endl;
for(int i=0;i<10;i++)
{
cout<<ary[i]<<" ";
}
cout<<endl;
int *p=ary; //指向数组头的指针
int *q=ary+sizeof(ary)/sizeof(ary[0])-1;//很巧妙的获取数组长度的方法;
while(p<q) //只需比较一半的反转方法
{
int t=*p;
*p=*q;
*q=t;
p++;
q--;
}
cout<<"反转后"<<endl;
for(int i=0;i<10;i++)
{
cout<<ary[i]<<" ";
}
cout<<endl;
}

4、地址也可以下标
#include<iostream>
using namespace std;
int main()
{
int ary[10]={0,1,2,3,4,5,6,7,8,9};
int *p=ary;
for(int i=0;i<10;i++)
cout<<p[i]<<" ";//地址也可以下标表示数
cout<<endl;
}
四、指向字符串的指针;
#include<iostream>
#include<cstdlib>
#include<string.h>//注意函数的额声明。string不可以。
using namespace std;
int main()
{
cout<<"字符串大小写转换"<<endl;
cout<<endl;
cout<<"***********************下标法*****************"<<endl;//常规方法
cout<<endl;
char str1[]="hello world";
cout<<"原来的字符串是:"<<str1<<endl;
int len=strlen(str1);
for(int i=0;i<len;i++)
{
if(str1[i]>=‘a‘&&str1[i]<‘z‘)
{
str1[i]+=‘A‘-‘a‘;
}
}
cout<<"大写的字符串:"<<str1<<endl;
cout<<endl;
cout<<"***********************数组名法*****************"<<endl;//也是数组名当指针,获取字符
cout<<endl;
char str2[]="hello world";
cout<<"原来的字符串是:"<<str2<<endl;
for(int i=0;*(str2+i);i++) //char最后以\0 结尾,其值为0;正好可以作为判断条件,而不用求字符串长度
{
if(*(str2+i)>=‘a‘ && *(str2+i)<‘z‘)
{
*(str2+i)+=(‘A‘-‘a‘);
}
}
cout<<"大写的字符串:"<<str2<<endl;
cout<<endl;
cout<<"*******************指针得到元素地址***************"<<endl;//也是数组名当指针,获取字符
cout<<endl;
char str3[]="hello world";
cout<<"原来的字符串是:"<<str3<<endl;
char *p=str3;
for(int i=0;*(p+i);i++) //char最后以\0 结尾,其值为0;正好可以作为判断条件,而不用求字符串长度
{
if(*(p+i)>=‘a‘ && *(p+i)<‘z‘)
{
*(p+i)+=(‘A‘-‘a‘);
}
}
cout<<"大写的字符串:"<<str3<<endl;
cout<<endl;
cout<<"*********************移动指针*****************"<<endl;//也是数组名当指针,获取字符
cout<<endl;
char str4[]="hello world";
cout<<"原来的字符串是:"<<str4<<endl;
p=str4;
for(int i=0;*p;i++) //char最后以\0 结尾,其值为0;正好可以作为判断条件,而不用求字符串长度
{
if(*p>=‘a‘ && *p<‘z‘)
{
*p+=(‘A‘-‘a‘);
}
p++;
}
cout<<"大写的字符串:"<<str4<<endl;
cout<<endl;
}

后面几种方法,本质上都是一样的。
五、指针与动态内存分配
1、内存分配方式
#include<iostream>
#include<string.h>
using namespace std;
int a; //全局变量,存储在全局/静态存储区
int main()
{
int b; //局部变量,存储在栈上
int *p= new int(); //由运算符 new 分配,存储在堆上
static int d; //静态变量,存储在全局/静态存储区
const int e=0; //常量,存储在常量存储区
delete p; //释放堆中的内存
return 0;
}
2、动态分配内存,很多书上说,如果数组长度依赖输入的话,是个变量,不能用局部变量的方式,但是 DEV C++ 5.11是可以的,如下程序
#include<iostream>
#include<string.h>
using namespace std;
int a; //全局变量,存储在全局/静态存储区
int main()
{
int n;
while(cin>>n)//输入矩阵长度
{
int a[n]={0};
for(int i=0;i<n;i++)
{
cin>>a[i];//赋值
cout<<a[i]<<" "; 输出
}
}
}

#include<iostream>
#include<string.h>
using namespace std;
int a; //全局变量,存储在全局/静态存储区
int main()
{
int n;
while(cin>>n)
{
int a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int sum=0;
for(int i=0;i<n;i++)
{
sum+=a[i];
}
cout<<(double)sum/n<<endl;
}
}

3、
#include<iostream>
#include<string.h>
using namespace std;
int a; //全局变量,存储在全局/静态存储区
int main()
{
int *pcount = new int; //堆上的一个数
cout<<"数组长度:";
cin>>*pcount;
cout<<*pcount<<endl;
cout<<"输入数组元素"<<endl;
int *parray = new int[*pcount];
for(int i=0;i<*pcount;i++) //为什么用下标表示啊?
{
cin>>parray[i];
}
cout<<"数组为:"<<endl;
for(int i=0;i<*pcount;i++)
{
cout<<parray[i]<<" ";
}
delete pcount;
delete parray;
return 0;
}

连接了指针和下标,蜜汁动态啊。
六、输出杨辉三角
1、两个数组的方式输出杨辉三角
#include<iostream>
#include<string.h>
using namespace std;
int a; //全局变量,存储在全局/静态存储区
int main()
{
cout<<"输入行数:";
int n;
cin>>n;
int a[20]={0},b[20]={0};//数组初始赋值
for(int i=0;i<n;i++)
{
b[0]=1;
b[i]=1;//每行第一个和最后一个都为1
for(int j=1;j<i;j++)
{
b[j]=a[j]+a[j-1]; //计算剩余位置值
}
for(int j=0;j<n-i-1;j++) //前导空格
{
cout<<" ";
}
for(int j=0;j<=i;j++)
{
if(j>0)
cout<<" ";
cout<<b[j]; //输出值
}
cout<<endl;
for(int j=0;j<=i;j++)//b数组值赋给a数组
{
a[j]=b[j];
}
}
return 0;
}

2、
标签:9.png 静态存储区 数组名 表示 地址 static strlen space 函数
原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/9010636.html