一.函數(shù)
二.指針
demo:輸入字符串輸出重復(fù)字符串次數(shù)
一.函數(shù)
1.程序的入口函數(shù)
main.cpp 為了讓閱讀者知道我這里面寫(xiě)的是入口函數(shù)
2.將不同的功能模塊用不用.h.cpp來(lái)封裝
.h 頭文件函數(shù)聲明(不能實(shí)現(xiàn):不能有{})
.cpp.c 實(shí)現(xiàn)穩(wěn)健 函數(shù)的具體實(shí)現(xiàn){}
3.導(dǎo)入頭文件進(jìn)行使用
#include<stdio.h>
#include"calculator.h"
int main(){
printf("1+1=%d\n",add(1,1));
printf("2-1=%d\n",minus(2,1));
printf("2*2=%d\n",multiply(1,1));
printf("2/2=%d\n",devide(1,1));
return 0;
}
這是實(shí)現(xiàn)文件(具體這個(gè)函數(shù)的操作)
1.先導(dǎo)入需要實(shí)現(xiàn)的頭文件
2.實(shí)現(xiàn)這個(gè)頭文件里面的所有方法 calculator.cpp
#include"calculator.h"
//加法
int add(int a,int b){
return a+b;
}
//減法
int minus(int a,int b){
return a-b;
}
//乘法
int multiply(int a,int b){
return a*b;
}
//除法
int devide(int a,int b){
if(b==0){
printf("錯(cuò)誤");
}else{
return a/b;
}
}
頭文件里面聲明函數(shù)calculator.h
#include<stdio.h>
int add(int a,int b);//加
int minus(int a,int b);//減
int multiply(int a,int b);//乘
int devide(int a,int b); //除
二.指針
1.什么是指針 作用
如果希望在函數(shù)之間傳遞數(shù)據(jù)(>1)給調(diào)用者
*:
①定義表明一個(gè)指針變量
②在使用過(guò)程中在前面加就是表示指針指向的值
&:取地址
2.指針的類(lèi)型:int *p=&a(整形指針) ; char *p (字符指針); int( *func)(int)(函數(shù)指針);指針變量只能指向同種類(lèi)型的地址
是一個(gè)變量,這個(gè)變量只能存地址世澜,所占空間大小為8個(gè)字節(jié)乡小。整形指針數(shù)組中每個(gè)元素都是整形數(shù)組柿扣,字符型指針數(shù)組中每個(gè)元素都是字符串
3.指針的值:就是指向的內(nèi)存空間的首地址
注意:變量本身布占空間智什,他只是一種映射關(guān)系漆枚,映射到那個(gè)內(nèi)存空間竞川。
聲明一個(gè)變量:比如int a棋嘲;沒(méi)給值酒唉,沒(méi)有立刻分配內(nèi)存空間,即沒(méi)有地址
定義一個(gè)變量:比如int a=沸移;則立刻分配了內(nèi)存空間痪伦,并且賦值
4.指針指向的值(區(qū)域):(星號(hào)p)
5.指針的運(yùn)算:二級(jí)指針有兩個(gè)(星號(hào))
6.指針和數(shù)組
7.指針和函數(shù)
![CD}A7ZER4R_24%3(`~(4.png
#include<stdio.h>
int test(int a, int s){
a+1;
s+1;
return a+1;
}
a+1;
s+1;
return a+1;
}
//一個(gè)return只能返回一個(gè)值
int test2(int a, int s){
a+1;
s+1;
return a+1;
}
int main()
{
int money=10;//普通變量
int salary=10000;
int*pa;//指針變量
char*pb;
int a1[10];
int*a2[2];
cahr*a3[3];
int test(int a);
int(*test)(int a);
printf("%d\n",sizeof(pa)) ;
int temp=10;
int *p=&temp;
*p=20;
return 0;
}
指針儲(chǔ)存的是地址
指向一個(gè)普通的變量:一級(jí)指針
直接改變 a=10 a的地址為0x100
間接改變 pa<=>0x100
pb==(0x200)=*(0x100)
pa為指針指向的變量
指向一個(gè)地址:二級(jí)指針
int a=20;
int pa=&a雹锣;
int (pc)=&pa网沾;
int ** pd=&pc;
pd->訪問(wèn)pc的值
訪問(wèn)a: pa蕊爵,pc绅这,pd
普通指針變量
int *pa
常量指針(常量在前,不能變)
int a=20在辆;
int b=30证薇;
int const *pa=&a;
pa=50匆篓;->錯(cuò)誤 不能改變指針只想的變量的值
pa=&b浑度;->正確 可以改變指針的指向
指針常量(指針在前)數(shù)組就是指針常量
intconst pb=&a;
*pb=50鸦概;->可以 改變指針指向的變量的值
pb=&b箩张;->錯(cuò)誤 不能改變指針的指向
指向常量的常量指針
int const *const pc=&a;
*pc=50窗市;錯(cuò)誤 不能改變指針指向的變量的值
pc=&b先慷;錯(cuò)誤 不能改變指針的指向
int *ptemp=&a;
ptemp=20咨察;->錯(cuò)誤 指針變量只能存地址
指針(后續(xù))
普通指針:int char 等平時(shí)常用的论熙。
常量指針
比如int a = 20;int const *pa = &a://const就是常量(命名根據(jù)const和 *pa的前后順序看) 指向的變量的值不能變摄狱,但是它可以改變指向關(guān)系 比如你要再寫(xiě) *pa=50脓诡;就不對(duì)无午。但是可以pa = &b;
比如查詢(xún)學(xué)生信息祝谚,但是你不能改學(xué)生的信息宪迟,就用這個(gè)。
指針常量
int * const pb = &a交惯;指向關(guān)系永遠(yuǎn)不能變次泽,但是可以改變里面的值。比如不可以pb = &b席爽,但是可以*pb = 50箕憾;數(shù)組就是一個(gè)指針常量。
指向常量的常量指針
int const const *pc = &a拳昌;或者const int *const pc =&a袭异;就是什么都不能變,也不能改變指向炬藤,也不能改變值御铃。
#include<stdio.h>
#include<stdlib.h>
void test (int a[]);
void test1 (int a[]);
//數(shù)組是一片連續(xù)的內(nèi)存空間,而指針只是一個(gè)變量沈矿,只不過(guò)這個(gè)變量只能存地址 共同點(diǎn):數(shù)組也可以用指針的方式去訪問(wèn)
int main (void){
int num [] = {1,2,3,4,5,6,7,8,9};//num(數(shù)組名)沒(méi)有分配內(nèi)存空間 因?yàn)閟izeof(num) = 36上真;說(shuō)明數(shù)組名本身沒(méi)有分配內(nèi)存空間
printf("%d\n",sizeof(num));//調(diào)用sizeof實(shí)際就是計(jì)算整個(gè)數(shù)組的所占的內(nèi)存大小
int *p = num;
printf("%p\n",num);
printf("%p\n",num+1);//這個(gè)打印出來(lái)比上一個(gè)多4
printf("%p\n",&num + 1);//這個(gè)打印出來(lái)比第一個(gè)多整個(gè)數(shù)組的字節(jié) 也就是說(shuō)(&a+1)就是指向下一個(gè)數(shù)組的起始地址。與(a+1)不同羹膳,(a+1)是下一個(gè)元素的起始地址睡互。
//test(num);
// test1(num);
//num[0] = 30;
//num[1] = 20;
//*num + 1 = 21;//這樣寫(xiě)不行 就相當(dāng)于 1 + 1 = 21 了
/* *(num + 1) = 30;//注意加括號(hào)
printf("%d\n",num[0] );
printf("%d\n",num[0] );
printf("%d\n",num[1] );
printf("%d\n",*(num + 1) );
printf("%p\n",num +1);*/
//num是指針常量,不能改變指向關(guān)系陵像,也就是說(shuō)不能用數(shù)組名進(jìn)行加減運(yùn)算就珠。比如不能寫(xiě)為num++;
//num+1不是加了整個(gè)數(shù)組的空間 num本質(zhì)是地址醒颖,也就是p p+1那就是看指針的類(lèi)型了妻怎。
/* *num+1 = 20;這個(gè)有如下兩種可能
*(num+1) = 20;//這個(gè)是對(duì)的
(*num)+1 = 20;*///這是錯(cuò)的
*p++ = 20;//有如下兩種情況
//(*p)++
//*(p++)// 這個(gè)是對(duì)的 *p++等價(jià)于*(p++),p先與++結(jié)合泞歉。表示:取*p的值并返回逼侦,然后將p+1指向下一個(gè)地址 對(duì)指針進(jìn)行++就是看指針的類(lèi)型,整型指針加4腰耙,
//字符型加1榛丢,指針型加8.
int a = (*p)++;
int b = *(p++);
printf("-----%d %d\n",a,b);
char name[] = {'a','b','c','d'};
char *p1 = name;
char c = *(p++);
/[圖片上傳失敗...(image-8b4726-1575551295365)]
ar c = *(++p);
printf("%c\n",c);
printf("%d\n",num[0]);
system("pause");
return 0;
}
void test (int *p){//只是把整個(gè)數(shù)組的第一個(gè)首地址傳過(guò)去了
printf("%d\n",sizeof(p));
}
void test1 (int a[]){//只是把整個(gè)數(shù)組的第一個(gè)首地址傳過(guò)去了
printf("%d\n",sizeof(a));
}
a+i2+j 是用指針訪問(wèn)數(shù)組中元素的方法 2是每一行有幾列
比如a[3][2] = {{1,2},{3,4},{5,6}};訪問(wèn)第一個(gè)就是a[0][0]
例子:p[0*2+0]
指針與函數(shù)
#include <stdio.h>
/*
指針和函數(shù)的關(guān)系
作用:通過(guò)指針間接訪問(wèn)某個(gè)內(nèi)存
*/
int add(int a, int b){
return a + b;
}
//定義一個(gè)函數(shù) 什么情況下參數(shù)是指針
//這個(gè)函數(shù)會(huì)不會(huì)改變傳遞過(guò)來(lái)的數(shù)據(jù)本身
//需要改變外部的值 就將這個(gè)變量定義為指針變量
void test(const int *pa, int *pb){
//(*pa)++;
(*pb)++;
printf("a = %d\n", *pa);
}
//函數(shù)接收數(shù)組時(shí),必須知道數(shù)組元素個(gè)數(shù)
//函數(shù)里面是通過(guò)指針變量來(lái)接收數(shù)組的地址
//指針變量無(wú)法確定指向的內(nèi)容的大小
//訪問(wèn)數(shù)組有兩種方式
//1. num[3]
//2. *(num+3)
void test2(int *p, int count){
for (int i = 0; i < count; i++){
p[i]++; //p[i] += 1;
//*(p + i)++; //*(p + i) += 1;
}
}
int main(){
int a = 10;
int b = 20;
test(&a, &b);
printf("a:%d b:%d\n", a, b);
int num[5] = {1,2,3,4,5};
test2(num,5);
for(int i = 0; i < 5; i++){
printf("%d ", num[i]);
}
return 0;
}