C++随记

2023-12-14 22:17:58

#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 )

  1. outfile.write((double *) &data, sizeof(double)) ;
  2. outfile.write((double *) &data, data) ;
  3. outfile.write((char *) &data, sizeof(double)) ;

//必须是char *类的,后面紧接着sizeof(double)

  1. outfile.write((char *) &data, data) ;

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];//合法

}

?

结构体指针的一些用法, p->/(*p). 一共有两种解决方法

数组指针和指针数组的引入和介绍

数组指针本质上是一个指针,指向的是一个数组,数组中的每个元素都是某种数据类型的值。

int (*p)[n]

int a[3][4];

int (*p)[4]; p=a;

p++;

//p是一个数组指针,指向了一个包含4int型元素的数组

//将二维数组的首地址赋给p,即a[0]a[0][0]

//跨过第一行,p指向了a[1][0]

指针数组:本质是一个数组,该数组中的每个元素都是一个指针

int a[3][4]; int *p[3];

//p++;

//定义了一个数组,该数组中有3int*指针变量,分别为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 = &sub;

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)都错

文章来源:https://blog.csdn.net/2302_79394843/article/details/134905512
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。