标签: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