学习c语言——进阶
指针的学习
1.使用指针交换数字
void swop(int *a, int *b) {
int t = *a;
printf("%p\n",&t);
printf("%p\n",&a);
printf("%p\n",a);
*a = *b;
*b = t;
}
int main() {
int a = 5;
int b = 6;
swop(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
2.使用指针的场景:返回值并改变值
#include<stdio.h>
int divide(int a,int b,int *result);
int main(void)
{
int a = 5;
int b = 2;
int c;
if(divide(a,b,&c)){
printf("%d/d=%d\n"a,b,c);
}
return 0;
}
int divide(int a,int b,int *result)
{
int ret = 1;
if(b==0) ret = 0;
else{
*result = a/b;
}
return ret;
}
3.使用指针返回多个值
#include <stdio.h>
void minmax(int a[],int len,int *max,int *min);
int main(void)
{
int a[] = {1,2,3,4,56,7,8,9,5,6};
int min,max;
minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
printf("min=%d,max=%d\n",min,max);
return 0;
}
void minmax(int a[],int len, int *min,int *max)
{
int i;
*min = *max=a[0];
for(i=1;i<len;i++)
{
if(a[i]<*min){*min = a[i];}
if(a[i]>*max){*max = a[i];}
}
}
4.使用指针注意事项:
1.指针p的类型必须与变量的类型一致
3.如何输出结果:
#include <stdio.h>
int main ()
{
int var_runoob = 10;
int *p;
p = &var_runoob;
printf("var_runoob 变量的地址: %p\n", p);
return 0;
}
5.指针的类型转换
●void表示不知道指向什么东西的指针
●计算时与char相同(但不相通,加一的时候大小变化的值是1)
●指针也可以转换类型
●int、*p = &i; void、q = (void)p;
●这并没有改变p所指的变量的类型,而是让后人用不同的眼光通过p看它所指的变量
●我不再当你是int啦,我认为你就是个void!
5.数组变量是常量指针
int b[] --> int * const
6.数组变量本身表达地址
7.[]运算符可以对数组做,也可以对指针做:
*a = 25;
const在*号的前面,表示它所指的东西不能被修改;
eg:const int* p1 = &i;int const* p2 = &i;
const在*号的后面,表示指针不能不能被修改
eg:int *const p3 = &i;
8.指针的运算
1.*p+1;看p是什么类型,如果是char,那么加一,如果是int,那么加二;其实就是加类型的大小
2.(星)p++表示:取出p所指的那个数据来,完事之后顺便把p移到下一个位置去.
3.p的优先级虽然高但是没有++高
4.常用于数组类的连续空间操作
5.在某些CPU上,这可以直接被翻译成一条汇编指令
#include <stdio.h>
int main(void)
{
char ac[] = {0,1,2,3,4,5,6,7,8,-1};
char *p = &ac[0];
int i;
for(i=0;i<sizeof(ac)/sizeof(ac[0]);i++){
printf("%d\n",ac[i]);
}
while(*p != -1){
printf("%d\n",*p++);
}
}
9.内存的动态分配
#include <stdio.h>
#include <stdlib.h>
int main(void){
int number,i;
int *a;
printf("输入数量:");
scanf("%d",&number);
a = (int *)malloc(number*sizeof(int));
for(i=0;i<number;i++){
scanf("%d",&a[i]);
}
for(i=number-1;i>=0;i--){
printf("%d ",a[i]);
}
free(a);
return 0;
}
1.malloc类型是void:void*malloc(size_t size);
2.向malloc申请的空间的大小是以字节为单位的1Mb=1 * 1024* 1024
3.返回的结果是void*,需要类型转换为自己需要的类型
4.(int *)malloc(n * sizeof(int))
5.使用不同的类型数据就使用不同的int,double,short,char
没有空间了?
1.如果申请失败则返回0,或则就做NIULL
3.使用指针的良好习惯是void *p=0;
字符串操作
1.单字符输入输出
#include <stdio.h>
int main(){
int ch;
while((ch = getchar()) != EOF){
putchar(ch);
}
printf("EOF\n");
return 0;
}
实现的功能:不断读取用户输入,输入ctrl+z可以使程序跳出循环,输入ctrl+c会使程序终止
2.字符串数组
数组传参的时候的,传的只是数组首字母的大小
#include <stdio.h>
int main(void) {
const int *a[] = {
(const int[]){1, 2, 3, 4, -1},
(const int[]){5, 6, -1},
(const int[]){7, 8, -1}
};
int size = sizeof(a) / sizeof(a[0]);
for (int i = 0; i < size; i++) {
int j = 0;
while (a[i][j] != -1) {
printf("%d ", a[i][j]);
j++;
}
printf("\n");
}
return 0;
}
如果已知数量就可以:改变的只有前面的部分,这个时候遍历的话,就不需要在每一个后面加上-1,可以直接用嵌套循环输出了
#include <stdio.h>
int main(void) {
const int a[3][5] = {
{1, 2, 3, 4, -1},
{5, 6, -1},
{7, 8, -1}
};
int size = sizeof(a) / sizeof(a[0]);
for (int i = 0; i < size; i++) {
int j = 0;
while (a[i][j] != -1) {
printf("%d ", a[i][j]);
j++;
}
printf("\n");
}
return 0;
}
3.字符串函数
==注意引用string.h函数
#include <stdio.h>
#define N 6
int binarySearch(int arr[], int n, int target);
int main() {
int arr[] = {8, 12, 23, 45, 54, 67};
int target = 67;
int index = binarySearch(arr, N, target);
if (index != -1) {
printf("目标元素 %d 在数组中的索引为 %d\n", target, index);
} else {
printf("目标元素 %d 未在数组中找到\n", target);
}
return 0;
}
int binarySearch(int arr[], int n, int target) {
int low = 0, high = n-1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
打开文件