#include<bits/stdc++.h> using namespace std; int main() { char* p = "C Language"; cout<<p<<'\n'; cout<<p+1<<'\n'; cout<<*p<<'\n'; cout<<*(p+2)<<'\n'; } |
C Language Language
C L
输出结果是p会输入整个字符串,而p+1则会把字符串往前移动一位后进行输出,而p指向的是第一个字母,而(p+2)指向的是第三个字母
#include<bits/stdc++.h> using namespace std; int main() { char str[] = "C Language", * p = str;//p指向字符串的指针相当于p指向了str[0] cout << p << endl;//输出:C Language 跟cout<<str<<endl;效果相同 cout << p + 2 << endl;//输出:Language 从字符L开始输出直到结束 cout << &str[7] << endl;//输出:age 从第7个元素开始输出 } |
C Language Language age
这句话和上面一样,p输出的依然是一整个字符串,而p+2也同理,从第三个字符开始输出,而
&str[7]实际上也就是和p+7等价就是从第8个元素开始输出
#include<bits/stdc++.h> using namespace std; int main() { char str[]="122344"; char *p=str; while(*p!='\0') { cout<<*p<<'\n'; p++; } } |
遍历的一个方法通过\0
#include<iostream> using namespace std; int main() { char str[100], * p = str; cin >> str; while (*p)p++; cout << "strlen=" << p - str << endl; return 0; } |
求字符数组长度的方法
指针不能直接指向一串地址
7. 已知 char* s1= "123", *s2="34";cout<<strcmp(s1,s2);的输出结果为( D )。 (A) true (B) false (C) 1 (D) -1 //strcmp是比较函数,右边小,返回-1 |
8. 设已定义浮点型变量 data,以二进制方式把 data 的值写入输出文件流对象 outfile 中去, 正确的语句是( C )。
//必须是char *类的,后面紧接着sizeof(double)
|
9. 已知 int A = 50; int * const iA = &A; const int B = 80; const int* iB = &B;下面哪条语句 不合法( B )。 (A) *iA = 200; (B) iA = &B; (C) iB = &A; (D) iB = iA //B改变了指向,这是不行的 //int *const指向是不能改的 |
#include<bits/stdc++.h> using namespace std; int main() { int a[2][3]; int *p[3]; p[0]=&a[2][3];//合法 } |
数组指针和指针数组的引入和介绍
数组指针本质上是一个指针,指向的是一个数组,数组中的每个元素都是某种数据类型的值。
int (*p)[n]
int a[3][4]; int (*p)[4]; p=a; p++; |
//p是一个数组指针,指向了一个包含4个int型元素的数组 //将二维数组的首地址赋给p,即a[0]或a[0][0] //跨过第一行,p指向了a[1][0] |
指针数组:本质是一个数组,该数组中的每个元素都是一个指针。
int a[3][4]; int *p[3]; //p++; |
//定义了一个数组,该数组中有3个int*指针变量,分别为p[0]、p[1]、p[2] //若执行此语句,则数组p指向下一个数组元素 |
for(int i=0;i<3;i++){ p[i]=a[i]; //数组p中有3个指针,分别指向二维数组a的每一行 } |
//补充:同样类似函数指针和指针函数的区分方法,可以通过从右到左结合来区分 //①对于数组指针 int (*p)[n],因为括号优先级较高,因此*号与数组名p先结合,也就是说p首先是一个指针,然后与[n]结合,表示指针p指向了一个大小为n的数组,数组的类型为int。 //②对于指针数组 int *p[n],p和[]先结合,因此p首先是一个大小为n的数组,剩下的部分是数组的类型,即int*类型,也就是数组的每个元素都是一个int*指针。 |
int p[n]; // 定义了一个指针数组,数组大小为 n ,数组中的每个元素都是一个 int 指针每个元素都是一个指针
访问数组的方式
p[i][j] *(p[i]+j) *(*(p+i)+j) *(p+i)[j] #include<bits/stdc++.h> using namespace std; int main() { int a[2][3]; cout<<a[2][3]; cout<<*(a[2]+3); cout<<*(*(a+2)+3); cout<<*(a+2)[3]; } |
0. 若有定义语句: int a[2][3],*p[3]; 则以下语句中正确的是( C )。 (A) p=a; (B) p[0]=a; (C) p[0]=&a[1][2]; (D) p[1]= &a; //本质上是指针数组,每个元素都是一个指针 |
11. 有函数原型 void fun(int *); 已知 int a =10; int *x = &a; 下面选项中,正确的调用是( A )。 (A) fun(x); (B) fun(*x); (C) fun(&x); (D) fun(*a); //本题最正确的是fun(x)和fun(&a) |
2、(3 分) 已知 char *a[] ={"you", "are", "a", "student", "right"};则 cout <<*(a+3); 的显示结果是? student //本质上这是一个二维数组,这个数组有5行,每一行都存了一个字符串,那么(a+3)就指向第3行,后 解引用,就可以输出student |
扩展
#include<bits/stdc++.h> using namespace std; int main() { char *a[] ={"you", "are", "a", "student", "right"}; cout<<a<<'\n'; cout<<a+1<<'\n'; cout<<*(a)<<'\n'; cout<<*(a+1); } |
0x78fdf0 0x78fdf8 you are |
#include<bits/stdc++.h> using namespace std; int main() { char a[] ={"you"}; cout<<a<<'\n'; cout<<a+1<<'\n'; cout<<*(a)<<'\n'; cout<<*(a+1); } |
you ou y o |
3. (3 分) 语句 cout<<setfill(‘%’)<<setw(6)<<3456; 的输出结果是? %%3456 //补全方式 |
#include<bits/stdc++.h> using namespace std; int main() { char str[10]; cin>>str; cout<<str; } //读到空格自动停止 |
int main() { int * p = NULL ; p = new int (50) ; if ( p == NULL ) { cout << "allocation faiure\n"; return 1; } cout << *p ; } new 动态生成的对象没有释放会造成内存泄露问题,需要在最后加上 delete p |
下列选项中,( B )是合法的常量。A -1e3.5 B “are” C a |
//下列表达式选项中,( A )是不正确的。 A ++(a++) B a+++b C ++(++x) D ++a+b 由于++需要常量,因此不能先a++,此时也是一个变量 |
下面各选项企图说明一种新的类型名 Int,其中正确的为( A )。 A typedef int Int ; B typedef Int int; C typedef Int =int; D typedef long long ll; |
函数指针和指针函数
指针函数本质是一个函数,其返回值为指针。函数指针本质是一个指针,其指向一个函数。
指针函数:int* fun(int x,int y);
函数指针:int (*fun)(int x,int y)
//函数指针用法 int add(int x,int y){ return x+y; } int sub(int x,int y){ |
return x-y; } //函数指针 int (*fun)(int x,int y); int main() { //第一种写法fun = add; qDebug() << "(*fun)(1,2) = " << (*fun)(1,2) ; //第二种写法fun = ⊂ qDebug() << "(*fun)(5,3) = " << (*fun)(5,3) << fun(5,3); //有两种调用方式func(5,3)等价于add(5,3) ,另外一种是(*func)(5,3) } //赋值方式 //fun = &Function; //fun = Function; //取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括 号括起来的参数表。 //调用方式 //x = (*fun)(); //x = fun(); |
设有函数说明和变量定义:int max(int x,int y); int(*p)(int,int)=max; int a, b; 以下不能正确调用 max 函数的是( C )。 A (*p)(a,b) B p(a,b) C (&p)(a,b) D max(a, b) p(a,b)实际上是直接调用 (*p)(a,b)是指针调用 max(a,b)是直接调用 //C就是瞎说了 |
设有函数说明和变量定义:int sum(int*,int); int(*p)(int*,int)=sum; int a[10], b; 以下不能正确调用 sum 函数的是( )。 A (&p)(a,b) B p(a,b) C (*p)(a,b) D sum(a, b) //同上 |
#include<bits/stdc++.h> using namespace std; int main() { char *str="\nThank\10you,\0sir!"; //答案是11,\n算一个,\10算一个,\n不算for(int i=0;i<strlen(str);i++) { cout<<str[i]; } } |
. int a = 4,b;对下面四个表达式的值说法正确的是( B)。 (1) b += (a++); (2) b += (++a); (3) (b++) += a; (4) (++b) += (a++); A.9、10、10、11 B.(3)式错误 C.(4)式错误 D.(3)(4)都错 |