一、字符指针

字符指针即指向字符类型的指针char*;
我们知道C语言中字符串有两种保存方式:数组保存指针保存,这两种方式从本质上来说有着很大的区别。
如图所示:数组保存时,在栈上开辟空间,字符串可以被访问修改;指针保存时,字符串保存在常量区,只可被访问,不能修改。
在这里插入图片描述
看下面这个程序:

#include <stdio.h>
int main()
{char str1[] = "hello world!";char str2[] = "hello world!";char *str3 =  "hello world!";char *str4 =  "hello world!";if(str1 ==str2)printf("str1 and str2 are same\n");elseprintf("str1 and str2 are not same\n");if(str3 ==str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");return 0;
}

运行结果:
在这里插入图片描述
str1和str2代表的是数组首元素的地址,而str1和str2是两个不同的数组,所以首元素地址不相同。str3和str4是两个指针,都指向保存在字符常量区的同一个字符串,所以地址值相同。

二、数组指针和指针数组

(一)区分

初学时容易混淆,所以先区分这两个概念。

1.从语言描述上

根据汉语定语修饰词在前,主语在后的习惯,“数组指针”中的“数组”是定语,“指针”是主语,所以数组指针是指针,而对于指针,我们第一反应就是这个指针指向什么,显然,数组指针是指向数组的。“指针数组”刚好相反,所以指针数组是数组,且存放的内容是指针。

2.从书写形式

看操作符的优先级
在这里插入图片描述
由于 [ ] 的优先级比*高,所以p1先和 [ ] 结合,必然是数组;p2有圆括号,所以先和*结合,构成指针。

(二)指针数组

1.定义

指针数组是一个存放指针的数组。如:

int *p[10];//一个数组,存放的内容是整型指针
int **p2[10];//存放二级整型指针的数组

2.指针数组的使用

整型指针数组

在使用整型数组指针时,要注意,不能直接将整型变量赋值给指针数组,因为指针数组的元素类型时int*,而赋予的变量类型是int型,类型不匹配。
如图:定义了一个整型指针数组并初始化,编译以后会发现程序有告警。
在这里插入图片描述

字符指针数组

字符指针数组可以直接赋值:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<windows.h>int main()
{char* arr[] = { "I","am ","gonna"," make"," the",\" world"," a", "better"," place" };printf("%s\n",arr[5]);//打印数组的第五个元素system("pause");return 0;
}

程序运行结果:
在这里插入图片描述

在这里,一个容易犯的错误就是打印输出时加上*解引用,导致程序崩溃:
在这里插入图片描述
arr[5]本质上是一个指向指向字符串"world"的首元素的指针,对其解引用得到的是字符’w’,而如果以s%的形式打印输入,便会引起程序崩溃。

补充:数组下标访问和指针访问

定义一个数组:

int num=0;
int arr[5][5]={};

下面这两种方式访问的是同一个元素:

num=arr[3][3];
num=*(*(arr+3)+3);

数组访问的方式很容易理解,下面对指针访问的方式进行分析:
在这里插入图片描述
arr是数组名,在这里代表首元素地址,即arr[0]的地址,arr[0]的地址+3表示数组第四个元素的地址,即a[3],而C语言中,a[3]表示一维数组的数组名,根据前面的结论,数组名即首元素地址,所以a[3]表示a[3][0] 的地址,&a[3][0]+3即为a[3][3]的地址,再解引用便是a[3][3]。

(三)数组指针

1.定义

int(*p)[10];//因为[]优先级比*高,所以要加括号

需要注意的是,数组的类型不仅指元素类型,还包括数组元素的个数,所以数组指针的类型也包括数组元素的个数,这里p指针指向的是一有10个整型元素的数组。

2.数组名与&数组名的区别

定义一个指针数组arr,分给打印arr和&arr:

int*arr[10]={0};
printf("%p\n ",arr);
printf("%p\n ",&arr);

在这里插入图片描述

打印结果相同,但是他们真的完全按一样吗?
通过下面这程序可以深刻理解数字名与&数组名的区别:

#include <stdio.h>
#include<Windows.h>
int main()
{int arr[10] = { 0 };printf("arr = %p\n", arr);printf("&arr= %p\n", &arr);printf("arr+1 = %p\n", arr + 1);printf("&arr+1= %p\n", &arr + 1);system("pause");return 0;
}

运行结果:
在这里插入图片描述
可见,arr+1是首元素地址加1,加上其所指向内容的大小,即4个字节;而&arr+1加上的是40个字节,是整个数组的大小。
对程序稍作更改,数组第一个和第二个元素分别赋值为1和2,查看内存,得到下面的结果:
在这里插入图片描述
很明显,对arr解引用得到的是数组第一个元素的值,所以arr代表的是数组首元素的地址;而对&arr解引用得到的是一个数组,所以从&arr是整个数组的地址,从本质上来说,&arr是数组指针类型。
结论:数组名在&后面和单组在sizeof中出现时表示整个数组,其余所有情况都表示数组首元素的地址。

3.数组指针的使用

数组指针主要在函数传参时使用,用于接收二维数组。

三、数组和指针的传参问题

一维数组传参

一维数组作函数实参时,形参可以是一维数组或者指针。
定义一个一维数组,让其作实参:

int arr[10];
Sort(arr);//调用sort函数

参数arr的类型是一个指向整型的指针,形参可以是下面任意一个:

void Sort(int *arr);//整型指针
void Sort(int arr[]);//整型数组

二维和多维数组

多维数组名作为函数参数传递的方式本质和一维数组相同——传递一个指向数组第一个元素的指针。但是,区别就是,多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数,以便于为函数形参的下标表达式求值。
二维数组做实参,形参可以是二维数组或一个数组指针,且这个数组指针必须是指向二维数组的元素类型的指针。如:

int arr[3][10];//定义一个二维数组
Sort(arr);//调用Sort函数,arr作形参

形参可以是以下类型:

void Sort(int (*arr)[10]);//定义一个指向10个整型变量的数组指针
void Sort(int arr[][10]);//定义一个数组(二维),其元素类型是有10个整型变量的一维数组

这里的关键是编译器必须知道第2个及以后各维的长度才能对各下标进行求值,因此形参必须声明这些维度的长度。
比如,下面的这一组不能作为形参接收二维数组:

void Sort(int **arr);//定义了一个二级指针,即指向整型指针的指针
void Sort(int *arr[10])//指针数组

这两个都和实参arr的类型不匹配,所以不能作形参。
多维数组传参和二维数组原理相同,只有第一个维度可以省略,二维及以上都不能省,用数组指针时,类型也必须是指向数组元素类型的指针。

一级指针传参

一级指针作实参,形参可以是一维数组或者一级指针。

二级指针传参

二级指针作传参,形参可以是二级指针、指针数组。

传参规则总结

  • 当二级指针作为函数形参时,能作为函数实参的是二级指针,指针数组,一级指针的地址
  • 当数组指针作为函数形参时,能作为函数实参的是二维数组,数组指针
  • 当二维数组作为函数形参时,能作为函数实参的是二维数组,数组指针
  • 当指针数组作为函数形参时,能作为函数实参的是指针数组,二级指针,一级指针的地址

对于二维数组和数组指针,有一个共同点,在定义时二维数组必须定义第二维的大小,而数组指针也必须指定其所指向的数组的大小,所以他们可以互相作为参数。
而对于指针数组,其数组名本质上是一个指向数组第一个元素的指针,即二级指针,类型匹配,所以可以作为形参接收二级指针,并被二级指针接收。

四、函数指针及其应用

(一)函数指针

定义

指向函数地址的指针

int fun();//函数声明
int (*pf)()=&fun//定义一个函数指针,指向fun函数

上面程序中,便是函数指针。定义函数指针时需注意优先级,变量名后面的()优先级比*高,所以要加()。
另外,函数名在使用时编译器会自动将其转换为函数指针,所以单目操作符&可以省略,即&fun和fun等价。函数名实际存放的是函数入口的地址。

使用

对函数指针定义并初始化以后,便可以使用,看下面三种方式:

int num=0;
num=fun(10);//1
num=(*pf)(10);//2
num=pf(10);//3

第一种:如上所述,函数名存放的是函数入口的地址,所以使用函数名调用函数的具体执行过程是,函数名fun首先被转换成一个函数指针,这个指针指向函数在内存中的存放位置,然后执行指针所指向位置的代码。
第二种:对pf进行解引用操作,指向函数名,在执行与第一种相同的步骤。
第三种:与第二种相同,操作符*在实际使用中可以被省略。

代码解析

  • First
//代码1
(*(void (*)())0)();

结论:这是一个从0地址处开始的函数调用
解析:

在这里插入图片描述
这里需要注意的是,0是一个常数,可以被当作地址来看待,也可以被强制转换为其他类型的指针,比如函数指针,然后只需要从里向外层层分解就可以理解这个语句的含义。

  • Second
//代码2
void (*signal(int , void(*)(int)))(int);

结论:这是一个返回类型是函数指针的函数声明,该函数的参数是一个int类型和一个函数指针
解析:
在这里插入图片描述
这里要理解的关键是signal函数的返回值类型是一个函数指针,可以把绿色方框内整体看作一个函数如:signal(),忽略其形参。而该函数的返回值是一个函数指针:void(*)int,便可以得到:void (*signal() ) (int),最后将函数的形参填入即可。

(二)函数指针数组

定义

把函数的地址存放到数组中,即为函数指针数组。如:

int (*arr[10])(int);

arr是一个函数指针数组,数组内存放的是指向返回值为int,形参也为int的函数指针。

应用:转移表

使用函数指针数组设计一个计算器,程序如下:

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>//exit函数头文件void Menu()//菜单
{printf("#####################################\n");printf("######    1.Add        2.Sub   ######\n");printf("######    3.Mul        4.Div   ######\n");printf("######           0.Exit        ######\n");printf("#####################################\n");
}
int MyExit(int x,int y)//退出函数
{exit(0);//exit函数需要有参数,可以设为0
}int Add(int x,int y)
{return x + y;
}int Sub(int x,int y)
{return x - y;
}int Mul(int x,int y)
{return x * y;
}int Div(int x,int y)
{//除法要先判断被除数不能为0if (y == 0) {printf("Warning:Div zero!\n");return -1;}return x / y;
}int main()
{int x = 0;int y = 0;int select = 0;//接收选项int ret = 0;//运算结果int (*p[])(int, int) = { MyExit,Add,Sub,Mul,Div };//转移表char* operators = "+-*/";//将符号保存在字符串中while (1){Menu();printf("Please select:");scanf_s("%d", &select);if (select >= 1 && select <= 4) {printf("Please enter the number:");scanf_s("%d %d", &x, &y);ret = p[select](x, y);//通过函数指针数组调用函数printf("%d %c %d=%d \n", x, operators[select - 1], y, ret);//下标方式访问operators}else if (select == 0) {printf("Bye-bye!\n");p[0](0, 0);//0为占位符,没有实际意义}elseprintf("Enter error!\n");}system("pause");return 0;
}

这里之所以能使用函数指针数组,是因为四则运算的每个函数类型相似,都有两个类型相同的参数,返回值类型也相同。这样用函数指针数组调用的方式,减少了很多重复代码。

(三)指向函数指针数组的指针

指向函数指针数组的指针是一个指针,它指向的是一个数组,这个数组保存的是函数指针。

int fun(int x)
{
return x;
}
int (*pfun)(int)=&test;//函数指针,&可以不写
int (*pfun_arr[])(int);//函数指针数组
int (*(*p_pfun_arr)[])(int)=&(*pfun[])(int);//指向函数指针数组的指针

▲(四)回调函数

1. 概念

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

2.应用——qsort函数

qsort是C语言的库函数,包含在<stdlib.h>头文件下,可以对任意数据类型进行排序
在这里插入图片描述
在这里插入图片描述

这个函数共有4个参数:

  • base:void*类型,指向要排序的数据的起始地址处。
  • num:unsigned int类型,要进行比较的数据个数。
  • size:数据的大小。
  • compar:函数指针类型,它指向一个用于比较指定类型的两个数据大小的函数,这个函数由使用者自己写出,它传入的参数是进行比较的两个数据的地址,返回值为正数、负数、或者0,返回值决定排序按升序还是降序进行。

int型数据qsort排序

#include<stdio.h>
#include<Windows.h>
#include<assert.h>
int int_compare(const void* x, const void* y)
{assert(x);//判断指针合法性assert(y);const int* x_ = (const int*)x;//将函数参数强转成int*类型并赋值给x_const int* y_ = (const int*)y;if (*x_ > *y_) {return 1;}else if (*x_ == *y_) {return 0;}else {return -1;}
}int main()
{int arr[] = { 10,24,98,19,2,8 };int num = sizeof(arr) / sizeof(arr[0]);qsort(arr, num, sizeof(int), int_compare);for (int i = 0; i < num; i++) {printf("%d ", arr[i]);}system("pause");return 0;
}

double型qsort排序

double类型的数据比较大小,原理与int相同,区别就是compare函数的写法,有一点需要注意,double型数据不能用‘==’比较。

#include<stdio.h>
#include<Windows.h>
#include<assert.h>
int double_compare(const void* x, const void* y)
{assert(x);//判断指针合法性assert(y);const double* x_ = (const double*)x;//将函数参数强转成double*类型并赋值给x_const double* y_ = (const double*)y;if (*x_ > *y_) {return 1;}else if (*x_< *y_) {return -1;}else {return 0;}
}void Print(double arr[],int num)
{for (int i = 0; i < num; i++) {printf("%.3f ", arr[i]);}printf("\n");
}
int main()
{double arr[] = { 9.84,6.200,6.52,4.21,48.25,58.666,98593.55 };int num = sizeof(arr) / sizeof(arr[0]);Print(arr, num);qsort(arr, num, sizeof(double), double_compare);Print(arr, num);system("pause");return 0;
}

字符串使用qsort排序

字符串比较大小的规则是:从起始位置开始进行字符的ASCII值比较,遇到第一个不相同的字符,ASCII值大的字符串大。

#include<stdio.h>
#include<Windows.h>
#include<assert.h>
#include<string.h>
int String_compare(const void* x, const void* y)
{assert(x);//判断指针合法性assert(y);//因为函数的参数是进行比较的变量的地址而此处要比较的\两个变量是char*类型,所以这里要用二级指针char**const char ** x_ = (const char**)x;const char ** y_ = (const char**)y;//strcmp的参数是字符串起始地址,所以此处要对*x_和*y_进行解引用return strcmp(*x_, *y_);
}int main()
{//定义一个指针数组,数组元素指向要进行比较的字符串char *arr[] = {"abcd1234","alkjgllkgj","sdagfsagf","agsafidfk","sagjsdakjd"};int num = sizeof(arr) / sizeof(arr[0]);qsort(arr, num, sizeof(char*), String_compare);for (int i = 0; i < num; i++) {printf("%s\n", arr[i]);}system("pause");return 0;
}

3.qsort函数模拟

用冒泡排序法模拟实现qsort函数

#include<stdio.h>
#include<Windows.h>
#include<assert.h>
#include<string.h>
int String_compare(const void* x, const void* y)
{assert(x);//判断指针合法性assert(y);//因为函数的参数是进行比较的变量的地址而此处要比较的\两个变量是char*类型,所以这里要用二级指针char**const char** x_ = (const char**)x;const char** y_ = (const char**)y;//strcmp的参数是字符串起始地址,所以此处要对*x_和*y_进行解引用return strcmp(*x_, *y_);
}void Swap(void* x, void* y,size_t size)
{char* x_ = (char*)x;char* y_ = (char*)y;//逐比特位交换两个变量,这种方式可以交换任意类型变量的值for (size_t j=0; j < size; j++) {*x_ ^= *y_;*y_ ^= *x_;*x_ ^= *y_;x_++, y_++;}
}void MyQsort(void* base, size_t num, size_t sz, int(*compare)(const void* x, const void* y))
{assert(base);assert(compare);for (size_t i = 0; i < num-1; i++) {int flag = 1;for (size_t j = 0; j < num - i - 1; j++) {//因为要排序的数据类型是不确定的,所以用char*来指向//通过起始地址+元素大小*所经历元素个数的方式,可以确定数据的地址\将数据地址传递给compare指向的函数,确定类型后可以比较两个数据的大小if (compare((char*)base + j * sz, (char*)base + (j + 1) * sz) > 0) {Swap((char*)base + j * sz, (char*)base + (j + 1) * sz, sz);flag = 0;}}if (flag){break;}}
}int main()
{//定义一个指针数组,数组元素指向要进行比较的字符串char* arr[] = {"nbcd1234","jlkjgllkgj","xdagfsagf","ygsafidfk","xagjsdakjd"};int num = sizeof(arr) / sizeof(arr[0]);MyQsort(arr, num, sizeof(char*), String_compare);//自定义函数MyQsortfor (int i = 0; i < num; i++) {printf("%s\n", arr[i]);}system("pause");return 0;
}

程序的内核是一个冒泡排序算法,而由于数据类型不能确定,与普通冒泡排序略有区别区别,首先,无法直接比较两个数据的大小,所以函数的形参中有个函数指针,在该函数中调用另一个函数,即回调函数,用于比较某一确定的数据类型的值的大小;其次,确定数据在内存中的地址方式也不一样,将起始地址强转成char*类型,加上类型大小乘以跨度确定地址;最后,交换两个变量的值时,逐比特位交换内容。

在这里插入图片描述

五、试题解析

(一)指针和数组试题

第一组 整型数组

ps:注释中“下一个数组的地址”这样的描述不准确,只是为了便于理解,其实际指的是数组最后一个元素下一个位置的地址,是一个指针数组,其指向与已经定义的数组类型相同。

	//一维数组int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a));//整个数组大小,16printf("%d\n", sizeof(a + 0));//数组名不是单独出现,首元素地址,4printf("%d\n", sizeof(*a));//首元素 4printf("%d\n", sizeof(a + 1));//第二个元素地址,4printf("%d\n", sizeof(a[1]));//第二个元素,4printf("%d\n", sizeof(&a));//整个数组的地址,4printf("%d\n", sizeof(*&a));//整个数组,16printf("%d\n", sizeof(&a + 1));//下一个数组的地址,4printf("%d\n", sizeof(&a[0]));//第一个元素的地址,4printf("%d\n", sizeof(&a[0] + 1));//第二个元素的地址,4

第二组 数组保存的单个字符

先了解strlen函数
在这里插入图片描述
C 字符串的长度等于字符串开头和终止空字符之间的字符数(不包括终止空字符本身)。

	//字符数组char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };printf("%d\n", sizeof(arr));//整个数组,6printf("%d\n", sizeof(arr + 0));//第一个元素的地址,4printf("%d\n", sizeof(*arr));//首元素,1printf("%d\n", sizeof(arr[1]));//第二个元素,1printf("%d\n", sizeof(&arr));//整个数组的地址,4printf("%d\n", sizeof(&arr + 1));//下一个数组的地址,4printf("%d\n", sizeof(&arr[0] + 1));//第二个元素的地址,4printf("%d\n", strlen(arr));//首元素地址,没有'\0',所以结果为随机值printf("%d\n", strlen(arr + 0));//首元素地址,随机值printf("%d\n", strlen(*arr));//首元素,报错printf("%d\n", strlen(arr[1]));//第一个元素,报错printf("%d\n", strlen(&arr));//整个数组的地址,数组指针类型,随机值,有告警printf("%d\n", strlen(&arr + 1));//下一个数组的地址,数组指针类型,随机值,有告警printf("%d\n", strlen(&arr[0] + 1));//第二个元素的地址,随机值

第三组 数组保存的字符串

	char arr[] = "abcdef";printf("%d\n", sizeof(arr));//整个数组,7printf("%d\n", sizeof(arr + 0));//字符指针,4printf("%d\n", sizeof(*arr));//字符型,1printf("%d\n", sizeof(arr[1]));//第二个元素,字符型,1printf("%d\n", sizeof(&arr));//数组指针,4printf("%d\n", sizeof(&arr + 1));//数组指针,4printf("%d\n", sizeof(&arr[0] + 1));//字符指针,第二个元素的地址,4printf("%d\n", strlen(arr));//首地址开始,6printf("%d\n", strlen(arr + 0));//首地址开始,6//printf("%d\n", strlen(*arr));//首元素,报错//printf("%d\n", strlen(arr[1]));//首元素,报错printf("%d\n", strlen(&arr));//整个数组的地址开始,类型不匹配告警,6printf("%d\n", strlen(&arr + 1));//下一个数组的地址开始,类型不匹配告警,随机值 printf("%d\n", strlen(&arr[0] + 1));//第二个元素的地址开始,5

第四组 char*指向的字符串

	char *p = "abcdef";printf("%d\n", sizeof(p));//指针,4printf("%d\n", sizeof(p + 1));//指针,4printf("%d\n", sizeof(*p));//字符a,1printf("%d\n", sizeof(p[0]));//下标引用,字符a,1printf("%d\n", sizeof(&p));//二级指针,4printf("%d\n", sizeof(&p + 1));//4printf("%d\n", sizeof(&p[0] + 1));//字符b的地址,4printf("%d\n", strlen(p));//首地址开始,6printf("%d\n", strlen(p + 1));//第二个元素的地址开始,5printf("%d\n", strlen(*p));//第一个元素,报错printf("%d\n", strlen(p[0]));//第一个元素,报错printf("%d\n", strlen(&p));//二级指针,随机值printf("%d\n", strlen(&p + 1));//二级指针,随机值printf("%d\n", strlen(&p[0] + 1));//第二个元素地址开始,5

▲第五组 二维数组

	//二维数组int a[3][4] = { 0 };printf("%d\n", sizeof(a));//整个数组,48printf("%d\n", sizeof(a[0][0]));//第一个元素,4printf("%d\n", sizeof(a[0]));//第一个数组的数组名,单组在sizeof中,表示整个数组,16printf("%d\n", sizeof(a[0] + 1));//没有单独放在sizeof内,第一个一维数组的第二的元素的地址,4printf("%d\n", sizeof(*(a[0] + 1)));//第一个一维数组的第二个元素,4printf("%d\n", sizeof(a + 1));//a是首元素地址,即第一个一位数组的地址,加一表示第二个一维数组的地址,4printf("%d\n", sizeof(*(a + 1)));//第二个一维数组的地址解引用,即第二个一维数组,16 printf("%d\n", sizeof(&a[0] + 1));//第二个一维数组的地址,4printf("%d\n", sizeof(*(&a[0] + 1)));//对第二个一维数组的地址解引用,表示第二个一维数组,16printf("%d\n", sizeof(*a));//a是第一行地址,第一个一维数组的地址解引用,表示第一个一维数组,16printf("%d\n", sizeof(a[3]));//sizeof不会访问目标,只根据类型来计算大小,故无报错,a[3]是一个包含四个整形的一维数组,16

二维数组的题要抓住几点:

  • 数组名大部分情况都表示首元素地址,而对于二维数组来说,首元素就是一个一维数组。
  • 数组名只有单独出现在sizeof内部和&符号后表示整个数组。
  • 二维数组的每一个一维数组名的表示方法

(二)笔试题

第一题

int main()
{int a[5] = { 1, 2, 3, 4, 5 };int *ptr = (int *)(&a + 1);printf( "%d,%d", *(a + 1), *(ptr - 1));return 0;
}

运行结果: 2,5
分析:&a表示整个数组的地址,加一指向数组后下一个位置,由于ptr类型是int*,减一实际减去所指向类型的大小,指向5的前面;a表示首元素地址,加一为第二个元素的地址,解引用后表示第二个元素。
如图:
在这里插入图片描述

第二题

//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{int Num;char *pcName;short sDate;char cha[2];short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
int main()
{printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}

运行结果: 0x100014,0x100001,0x100004
分析: 结构体的大小为20个字节,所以指针加一,加上的是20,转换成16进制即为14;将p强制转换成无符号长整型后,对其加一,实际值也加一;将p强转成unsigned int *类型,加一,实际值加四,因为指针的大小为四字节。

第三题

int main()
{int a[4] = { 1, 2, 3, 4 };int *ptr1 = (int *)(&a + 1);int *ptr2 = (int *)((int)a + 1);printf( "%x,%x", ptr1[-1], *ptr2);return 0;
}

运行结果: 4,2000000
分析: ‘%p’格式与’%x’格式都是按十六进制输出,区别是 ‘%p’格式会输出八位,不够八位的补零,’%x’格式不会补0。
这里指针ptr指向的是数组最后一个元素的下一个位置,因其被强转成int*类型,ptr[-4]指向的是原来位置往前四个字节的位置,即指向4的最前面;
a强制转换为int型后值加1,再强为int *类型,指向的位置如下图所示,数据在内存中的存储遵从大小端原则,小端存储转低权值位在低地址处,读取时同样遵从小端的规律,高地址处的数据放在高权值位,所以读取顺序为02 00 00 00,最终结果为2000000。
在这里插入图片描述

第四题

#include <stdio.h>
int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };int *p;p = a[0];printf( "%d", p[0]);return 0;
}

运行结果: 1
分析: 数组在内存中的存储如图所示,圆括号中是逗号表达式,最终数组元素的值是逗号右边的值;a[0]是第一个一维数组的数组名,表示首元素地址,即a[0][0]的地址,赋值给p后,p指向首元素的位置,p[0]数组下标引用,表示偏移量为0,仍然指向原来1的位置。
在这里插入图片描述

第五题

int main()
{int a[5][5];int(*p)[4];p = a;printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);return 0;
}

运行结果: FFFFFFFC,-4
分析: 内存布局如下图所示,指针p跨度为4,最终与 &p[4][2] 与 &a[4][2]之间差4个字节,结果为-4,以%p打印输出结果则为FFFFFFFC。
在这里插入图片描述

第六题

int main()
{int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int *ptr1 = (int *)(&aa + 1);int *ptr2 = (int *)(*(aa + 1));printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));return 0;
}

运行结果:10,5
分析:&aa+1指向二维数组最后一个元素后面的位置;aa+1是指向第二个一维数组的数组指针,解引用后表示整个数组,等价于aa[1],即第个二维数组的数组名,表示第二个二维数组首元素的地址,即a[1][0]的地址,强转后减一,指向a[0][4]。在这里插入图片描述

第七题

#include <stdio.h>
int main()
{char *a[] = {"work","at","alibaba"};char**pa = a;pa++;printf("%s\n", *pa);return 0;
}

运行结果: at
分析: 字符指针数组的写法并不是把字符串放保存在数组里,字符串是保存在内存中的静态字符常量区,这里只是用指针指向每个字符串第一个字符的地址,将这样的指针保存在数组中,与定义指针指向字符串原理相同,如:

char *pc="hello world";

这里的pc指向字符串的第一个字符’h’,并不是把字符串保存在pc中。
本题的数组a,是一个指针数组,保存了3个指向字符串的指针,如图:
在这里插入图片描述
pa是一个二级指针,指向a[0]这个一级指针,对pa自增后,其指向下一个一级指针a[1],pa解引用得到一个字符指针,%s打印输出,结果则为’at’。

第八题

int main()
{char *c[] = {"ENTER","NEW","POINT","FIRST"};char**cp[] = {c+3,c+2,c+1,c};char***cpp = cp;printf("%s\n", **++cpp);printf("%s\n", *--*++cpp+3);printf("%s\n", *cpp[-2]+3);printf("%s\n", cpp[-1][-1]+1);return 0;
}

“ENTER” “NEW” “POINT” “FIRST”
运行结果:
POINT
ER
ST
EW
分析: 内存分布图如下:
在这里插入图片描述
1.printf("%s\n", **++cpp);
++cpp对cpp进行自增,需要注意,cpp的指向会发生改变,且对后面都有影响。
在这里插入图片描述
所以结果为POINT。
2.printf("%s\n", *--*++cpp+3);
需要注意此时的cpp要用第一次自增后的指向;此时的cpp指向cp[1],自增后则指向产品[2],对cp[2]自减,其指向由cp[1]变为c[0],解引用则得到c[0]原来指向字符第一个字符’E’,c[0]+3指向第二个字符’E’,但是从[0]的指向只是临时改变,并没有赋值保存。如图:
在这里插入图片描述
3.printf("%s\n", *cpp[-2]+3);
cpp[-2]为数组下标引用,表示cp[0],其指向c[3],所以*cpp[-2]表示c[3],c[3]指向字符’F’,所以c[3]+3指向字符’S’,打印结果为’ST’。注意cpp[-2]与cpp-2的区别,cpp[-2]等价于*(cpp-2)。
在这里插入图片描述
4.printf("%s\n", cpp[-1][-1]+1);

等价于*(*(cpp-1)-1),cpp[-1][-1]表示c[2],c[2]是一个字符指针,指向字符’N’,加1后指向字符’E’。如图所示:
在这里插入图片描述

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 洛谷P2497:基站建设(splay、斜率优化)

    所谓splay斜率优化dp&#xff0c;就是利用splay和斜率对dp进行优化 &#xff08;逃&#xff09; 解析 在斜优的时候&#xff0c;有时我们会发现我们插入的点的横坐标并不单调 这个时候我们就无法利用单调队列维护凸包了 这时&#xff0c;我们就要请出今天的主角&#xff1a;s…...

    2024/5/1 5:07:48
  2. 基于MATLAB的人民币纸币系列号面额识别系统【GUI】

    一、课题介绍 本设计为基于MATLAB的人民币识别系统。带有一个GUI界面。先利用radon进行倾斜校正&#xff0c;根据不同纸币&#xff0c;选择不同维度的参数识别纸币金额&#xff0c;有通过RGB分量识别100元&#xff1b; 通过面额图像的宽度识别1元、5元&#xff1b;通过构建矩形…...

    2024/4/24 15:47:32
  3. 【百度快照】基于MATLAB GUI的条形码识别系统

    1.1 应用MATLAB识别条形码总体设计 本设计为基于MATLAB的条形码识别系统&#xff0c;带有一个GUI界面。 1.1.1 程序总体设计思路 在上节中我们简单的介绍了MATLAB的发展以及优点。在以后的章节中将阐述如何应用MATLAB编程实现对条形码的识别。在这一节中将主要介绍编程的总体思…...

    2024/5/1 5:21:05
  4. 【百度快照】MATLAB视频图像去雾(视频处理,图像去雾,直方图,暗通道,论文)

    一、课题介绍 雾霾&#xff0c;它会使大气的能见度降低&#xff0c;景物图像发生退化&#xff0c;在雾霾下拍摄的图像内容模糊&#xff0c;对比度下降&#xff0c;这将会严重影响人们的行车系统&#xff0c;卫星系统&#xff0c;导航系统等。目前&#xff0c;拍摄器材成本还是比…...

    2024/4/24 15:47:37
  5. 基于MATLAB颜色的植物虫害检测识别

    一、课题介绍 本课题是基于MATLAB颜色的植物虫害检测识别&#xff0c;可以辨析植物叶子属于是轻度虫害&#xff0c;中度虫害&#xff0c;严重虫害&#xff0c;正常等四个级别。算法流程&#xff1a;每种等级叶子分别放在同一个文件夹&#xff0c;训练得到每个文件夹每个叶子的颜…...

    2024/5/1 8:09:24
  6. 一种用户名含有中文的texlive2021安装方案(win10)

    一种用户名含有中文的texlive2021安装方案&#xff08;win10&#xff09;前言镜像文件与虚拟光驱镜像文件下载虚拟光驱下载安装过程参考关于ctex兼容性检查iso文件是否损坏关于【用户名含有中文】的解决方案写在前面如何成功安装&#xff1f;完成安装tips意见建议与问题反馈前言…...

    2024/4/24 15:47:29
  7. 04.go实现(stack)栈

    import "fmt"type Stack struct {data []interface{} }func (s *Stack) Push(k interface{}) {s.data append(s.data, k) }func (s *Stack) Pop() interface{} {if len(s.data) 0 {return nil}n : len(s.data) - 1v : s.data[n]s.data s.data[:n]return v }...

    2024/5/1 8:18:12
  8. Java笔记 --- 基本数据类型与String转换

    一、基本数据类型与 String类型转换 将基本数据类型转成String类型&#xff0c;或者将String类型转成基本数据类型。 1、基本数据类型转String类型 package demo01;public class String01 {public static void main(String[] args) {int a1 10;long a2 100;float a3 100.…...

    2024/4/24 15:47:27
  9. JavaScript 学习之一篇了解--Bom

    1、什么是BOM BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而于浏览器窗口进行交互的对象。 BOM的核心对象是window BOM由一系列相关的对象构成&#xff0c;并且每个对象都提供了很多的方法和属性 BOM缺乏标准&#xf…...

    2024/4/24 16:03:38
  10. CSDN实训第三天-Java薪资转换

    1.Java基本输入输出 基本的输入&#xff0c;System.in代表系统的标准输入设备。 基本的输出&#xff0c;System.out 就是系统的标准输出设备。 import java.util.Scanner; //导入一个Scanner类public class Test{public static void main(String[] args){Scanner inp…...

    2024/4/24 16:03:34
  11. windows命令行ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)

    找了半天&#xff0c;服务也重启过了还是没用 在sqlyog可以登陆,但是在命令行就会出现如上报错。 原因是没有指定端口登陆&#xff0c;在命令行的该条指令指定的是默认端口号3306&#xff0c; 如果你是改了端口的话应该添加如下参数 -P 端口号综上所述&#xff0c;搞了我一小时…...

    2024/4/24 16:03:33
  12. 创建型模式——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

    声明&#xff1a; 本博客参考C语言中文网&#xff1a;C语言中文网连接 主要记录学习以下内容&#xff1a; 一、简单工厂模式 二、工厂方法模式 三、抽象工厂模式 每个大要点都主要包括以下两部分内容&#xff1a; &#xff08;1&#xff09;基本概念和模型结构&#xff08;包括…...

    2024/5/1 5:18:30
  13. 图书管理系统(c语言结课作业)

    c语言结课作业用书:c程序设计 闫锴 张连浩关于代码书上程序结构混乱 也有很多bug我也没怎么改 所以输入样例都是严格按照输入输出格式来的 就别吐槽了另外数据通过二进制文件进行存放更新 #include<stdio.h> #include<stdlib.h> #include<string.h> #i…...

    2024/5/1 8:54:35
  14. 求平均成绩和优秀率

    编写程序&#xff0c;计算学生们的平均成绩&#xff0c;并统计优秀&#xff08;成绩不低于90分&#xff09;的人数占总人数的比率。 输入格式: 输入在第一行中给出非负整数N&#xff0c;即学生人数。第二行给出N个非负整数&#xff0c;即这N位学生的成绩&#xff0c;其间以空…...

    2024/4/24 16:03:31
  15. JAVA-继承(笔记)

    JAVA-继承-笔记继承的好处和弊端继承中变量访问的特点super关键字的用法(和this关键字)继承中构造方法的访问特点子类对父类的方法重写继承的注意事项关于static和final继承的好处和弊端 好处&#xff1a; 提高了代码的复用性&#xff08;多个类相同的成员放在同一个类中&…...

    2024/5/1 8:08:32
  16. 打卡:算法起步解题篇章:1.力扣886,回文质数+2.剑指Offer 49.丑数

    第一题AC码&#xff1a; 第一题&#xff0c;最开始我用打表 int a[5960]{//防止作弊不给予具体显示}; 都知道的&#xff0c;过了但是心里不踏实。下了晚自习开始写&#xff0c;结果写了那么久&#xff08;一直TL)。 题解关键在于1.sqrt(x1e-6) 2.偶数位数回文数必定不是质数…...

    2024/4/24 16:03:29
  17. Jupyter notebook修改默认文件夹\默认路径(亲测有效)

    Jupyter notebook修改默认文件夹\默认路径(亲测有效) 最近一直要用jupyter notebook写一些程序&#xff0c;但是打开后出现的原始工作路径是这样的&#xff1a; 网上找了很多方面都不全面&#xff0c;就总结了一下希望能一次性解决 我是用anaconda的jupyter&#xff0c;所以…...

    2024/5/1 6:00:39
  18. Javascript进阶知识之事件高级

    注册事件 两种方式&#xff0c;传统方式onclick和方法监听注册方式addEventListener 利用 on 开头的事件 onclick <button οnclick“alert(‘hi~’)”>< /button> btn.onclick function() {} 特点&#xff1a; 注册事件的唯一性 同一个元素同一个事件只能设置一…...

    2024/4/24 16:03:28
  19. 《百钱百鸡》

    1、中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”&#xff1a;鸡翁一&#xff0c;值钱五&#xff0c;鸡母一&#xff0c;值钱三&#xff0c;鸡雏三&#xff0c;值钱一&#xff0c;百钱买百鸡&#xff0c;问翁、母、雏各几何&#xff1f; 要求&#xff1…...

    2024/4/24 16:03:25
  20. 5个顶级的硬盘数据恢复软件

    http://blog.yiyidu.com/2009_411.html在一亿度眼里,硬盘是电脑配件里真正的CPU,假如你没有使用硬盘检测工具监视好你的硬碟,或者误操作删除了文件,甚至是格式化了硬盘、错误的合并删除硬盘分区,那么其它配件就算全换新的也没用!这时只有使用专业的硬盘数据恢复软件来拯救…...

    2024/4/24 16:03:32

最新文章

  1. 【stomp 实战】Spring websocket 用户订阅和会话的管理源码分析

    通过Spring websocket 用户校验和业务会话绑定我们学会了如何将业务会话绑定到spring websocket会话上。通过这一节&#xff0c;我们来分析一下会话和订阅的实现 用户会话的数据结构 SessionInfo 用户会话 用户会话定义如下&#xff1a; private static final class Sessio…...

    2024/5/1 9:35:16
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 巨控科技新品发布:全方位升级,引领智能控制新纪元

    标签: #巨控科技 #智能控制 #新品发布 #GRM560 #OPC560 #NET400 在智能控制领域&#xff0c;巨控科技始终以其前沿技术和创新产品引领着市场的潮流。近日&#xff0c;巨控科技再次以其行业领先的研发实力&#xff0c;推出了三大系列的新产品&#xff0c;旨在为各行各业提供更…...

    2024/4/30 1:46:55
  4. JVM学习笔记

    文章目录 一、内存模型1. 程序计数器2. 栈3. 本地方法栈4. 堆5. 方法区方法区位置字符串常量池位置 6. 直接内存 二、虚拟机参数设置三、类的生命周期1. 加载2. 连接1&#xff09;验证2&#xff09;准备3&#xff09;解析 3. 初始化4. 卸载 四、类加载器1. 启动类加载器2. 扩展…...

    2024/4/30 4:11:49
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57