C/C++知识点

本文介绍了C语言的基本概念和操作,包括三目运算、逗号运算、字符与字符串处理、位移运算、数组、结构体、指针、动态内存分配以及函数调用。强调了指针的使用,如指针初始化、解引用、指针与数组的关系,并讨论了指针与结构体的交互。还涉及了动态内存分配的示例和函数的传值与传地址调用。同时,提到了变量的作用域和存储类型,特别是静态变量在函数中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.三目条件运算

e1 ? e2 : e3 (eg: a> b ? a : b)
如果e1成立,则取e2,否则取e3。

2.逗号结合运算

值取最后一个表达式的值。

eg: a = 2 * 5, a // 10, a - 2
表达式的值为:8, a = 10.

x = (a =10, b = 100, c = 1000)
表达式的值为:x = 1000

3.字符与字符串
‘A’ 65; ‘a’ 97;
‘a’ - 32 = 65 = ‘A’; ‘A’ + 32 = ‘a’;

‘0’ 48; ‘9’ 57;
9 + ‘0’ = ‘9’; 9 + 48 = ‘9’
整数加上48为该整数的字符表示

4.左移<<、右移>>运算符
变量名 运算符 移动的位数(eg: n >> 3,表示n右移3位)

  • 每右移n位相当于除以2n
  • 每左移n位相当于乘于2n

所以:
n * 8 等价于 n<<3
n // 8 等价于 n>>3

注意:操作并不改变变量本身的值!!!

5.数组
数组名表示数组的首地址,其值不可改变!如下对数组b赋值为错误表达式。

int a[5] = {0, 1, 2, 3, 4}, b[5];
b = a; //错误!!!

而应该改成:

for (int i = 0; i <= 5; ++i){
	b[i] = a[i]
}

数组不能通过数组名进行赋值,只能通过元素进行赋值!

char str[10];
scanf("%s", str); /*数组名str本身就是数组的起始地址,所以不用&str*/
//scanf_s("%s", str, 9);

6.结构

与数组不一样,结构可以由不同类似的数据类型构成。
如下两种方式定义与使用结构:

struct student{
	int id;
	char name;
	float score;	
};

struct student s1 = {1, "Jam", 98.5};
typedef struct student{
	int id;
	char name;
	float score;	
}Student;

Student s1 = {1, "Jam", 98.5};

数组不能彼此赋值,但同类型的结构变量可以彼此赋值。如下:

struct student s1, s2 = {1, "jam", 98.5};
s1 = s2; // 正确!!!

7.指针

  • 指针*p需要先定义和初始化,后再使用;如果不初始化,可指向NULL,避免野指针问题。
  • 指针变量定义的时候,* 为指针变量标志符;
  • 指针变量使用的时候,* 为解引用(与&引用符为对偶操作),为运算符。

eg:

int a = 5, *p = NULL;
p = &a;
*p = 10  // a = 10

上面的程序结果中:a = 10, &a = p = 地址1, *p = a = 10, &p = 地址2 != 地址1.

int x, *ptr = &x;
&(*ptr) //等价于指针ptr
*(&x)  //等价于变量x

使用时,& 与 * 为一对对偶操作!!!
指针存放地址,访问速度更快;访问数组更加快速灵活;增加了访问内存空间的方法。

c++中数组名在内存中存放数组的首地址。

int a[5], *p;
p = a; // p == &a[0]
p++; //p == &a[1]

8.指针与数组
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

9.指针与结构数据
在这里插入图片描述

10.二重指针

指向指针的指针

指针数组就是一个二重指针!!!
在这里插入图片描述

在这里插入图片描述

9.字符指针
指针指向字符数组,字符数组里面的元素是可以被修改的;但是如果指针指向的是字符串常量,常量的数据是不能被修改的。

char buffer1[] = "hello";
char *pch1 = buffer1; //指向字符数组
char *pch2 = "hello"; //指向字符串常量
*pch1 = 'x'; //正确,将字符数组中的第一个元素'h'改成了'x'
*pch2 = 'x'; //错误!!!不可修改字符串常量中的元素

10.动态内存
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#define N 10
int main(){
	int *p, *q, i = 0;
	q = p = (int *)malloc(N*sizeof(int));
	if(p){
		for (i = 0; i < N; ++i, ++p{
		*p = i + 1;
		printf("%d", *p);
		}
	}
	free(q);
	system("pause");
	return 0;
}

11.函数

传值调用和传地址调用
在这里插入图片描述

在这里插入图片描述

12.作用域与存储类型

静态变量仅初始化一次,变量的值可保存到下次进入函数,使函数具有记忆功能。
如下利用静态变量计算整数n的阶乘:

#include<stdio.h>
long Func(int n);
int main(){
	int i, n;
	printf("input n : ")
	scanf("%d", &n);
	for (i = 1; i <= n; i++){
		printf("%d! = %ld\n", i, Func(i));
	}
	return 0;
}
long Func(int n){
	static long p = 1; //定义静态变量
	p = p * n;
	return p;
}

在这里插入图片描述
全局变量:在函数外部定义的变量;局部变量:函数内部定义的变量;
静态局部变量(static申明):离开函数后,内存并没有释放,因此值仍会保留,再次访问函数时,值并不会初始化,而是使用上次保留的值;
动态局部变量(默认):离开函数后,内存就释放了,值也就消失了,再次访问函数时,内部的局部变量会重新初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值