網(wǎng)站怎么提高權(quán)重百度招聘網(wǎng)最新招聘信息
目錄
- 1. 字符指針
- 1.1 一般用法:字符指針指向單字符
- 1.2 第二種用法,字符串首地址給指針變量
- 1.3 習題,下面代碼的輸出結(jié)果是什么?為什么?
- 2. 指針數(shù)組
- 2.1實例—— 字符指針數(shù)組
- 2.2實例——整形指針數(shù)組
- 2.3 例子,識別下下面的的指針數(shù)組是什么意思
- 3. 數(shù)組指針
- 3.1 數(shù)組指針的定義
- 3.2 &一維數(shù)組名VS一維數(shù)組名
- 3.2.1 實例——&arr和arr分別表示什么
- 3.3 數(shù)組指針的使用
- 3.3.1 使用實例1
- 3.3.2 使用實例2
- 3.3.3 練習
1. 字符指針
在指針的類型中我們知道有一種指針類型為字符指針 char* ,指向字符的指針
1.1 一般用法:字符指針指向單字符
#include<stdio.h>int main()
{//字符指針char a = 'm';char* pc = &a;pc = 'w';printf("%c", pc);return 0;
}
1.2 第二種用法,字符串首地址給指針變量
char *str ="abcdef"的本質(zhì)意義是把字符串的首字符的地址傳給指針變量str了
#include<stdio.h>int main()
{//字符指針char* str = "abcdefgh";char* ps = str;printf("%s", ps);return 0;
}
這里我還寫了個錯誤代碼
#include<stdio.h>int main()
{//字符指針//char a = 'm';//char* pc = &a;//pc = 'w';//printf("%c", pc);char* str = "abcdefgh";char* ps = &str; //給str取地址了printf("%s", ps);return 0;
}
這里傳給*ps的地址就不是字符串的首地址了,傳的是&str自己的地址,
1.3 習題,下面代碼的輸出結(jié)果是什么?為什么?
#include <stdio.h>
int main()
{char str1[] = "hello code.";char str2[] = "hello code.";const char* str3 = "hello code.";const char* str4 = "hello code.";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;
}
分析:代碼結(jié)果第一個是not same 第二個是same
這里str3和str4指向的是一個同一個常量字符串“hello code”。C/C++會把常量字符串存儲到單獨的一個內(nèi)存區(qū)域,當幾個指針(這里是str3和str4)指向同一個字符串的時候,他們實際會指向同一塊內(nèi)存。但是用相同的常量字符串去初始化不同的數(shù)組的時候(str1和str2)就會開辟出不同的內(nèi)存塊。所以str1和str2不同,str3和str4不同。
2. 指針數(shù)組
指針數(shù)組
字符數(shù)組,是存放字符的數(shù)組
整形數(shù)字,是存放整形的數(shù)組
所以指針數(shù)組是存放指針(地址)的數(shù)組
2.1實例—— 字符指針數(shù)組
#include<stdio.h>
int main()
{const char* arr[5] = {"abcd","qw","ertyi","pouggttrr","sky"};//這里最好還是加上const 因為存儲的是字符串常量,是不變的值,//我們不希望被改變,const修飾char*,表示char*指向的值不能被修改int i = 0;for (i = 0; i < 5; i++){printf("%s\n", arr[i]);}return 0;
}
分析
2.2實例——整形指針數(shù)組
#include <stdio.h>int main()
{int arr1[5] = { 1,2,3,4,5 };int arr2[5] = { 5,4,3,2,1 };int arr3[5] = { 7,8,9,4,5 };int arr4[5] = { 9,1,2,3,8 };int* arr[4] = { arr1,arr2,arr3,arr4 };int i = 0;for (i = 0; i < 4; i++){int j = 0;for (j = 0; j < 5; j++){printf("%d ", arr[i][j]); //arr[i]是找到我們的arr1/2/3/4,然后再[j]就是進入arri(i= 1,2,3,4)找到其中的每一個元素 // printf("%d ",*( arr[i]+j) ); 這樣打印也可以}printf("\n");}return 0;
}
分析
2.3 例子,識別下下面的的指針數(shù)組是什么意思
int* arr1[10]; //整形指針的數(shù)組,存放的是整形指針的數(shù)組
char *arr2[4]; //一級字符指針的數(shù)組,存放的是一級字符型指針的數(shù)組
char **arr3[5];//二級字符指針的數(shù)組,存放的是二級字符型指針的數(shù)組
3. 數(shù)組指針
3.1 數(shù)組指針的定義
數(shù)組指針是指針?還是數(shù)組?——是指針
字符指針——存放字符地址的指針—指向字符的指針char *
整型指針——存放整型地址的指針—指向整型的指針 int *
浮點型的指針——存放浮點型地址的指針—指向浮點型的指針 float* double*
數(shù)組指針——存放數(shù)組地址的指針——指向數(shù)組的指針
如何表示:
int (*p)[10];
分析:p先和*結(jié)合,說明p是一個指針變量,然后指著指向的是一個大小為10個整型的數(shù)組。所以p是一個指針,指向一個數(shù)組,叫數(shù)組指針
注意:[ ]的優(yōu)先級要高于 * 號的,所以必須加上( )來保證p先和 * 結(jié)合
3.2 &一維數(shù)組名VS一維數(shù)組名
int arr[10];
arr 和 &arr 分別是啥?
我們已經(jīng)知道arr是數(shù)組名,數(shù)組名表示數(shù)組首元素的地址。
那&arr數(shù)組名表示的是什么?
3.2.1 實例——&arr和arr分別表示什么
#include <stdio.h>
int main()
{int arr[10] = { 0 };printf("%p\n", arr);printf("%p\n", &arr[0]);printf("%p\n", &arr);return 0;
}
- 我們給每個指針+1
#include <stdio.h>
int main()
{int arr[10] = { 0 };printf("%p\n", arr);printf("%p\n", arr+1);printf("%p\n", &arr[0]);printf("%p\n", &arr[0]+1);printf("%p\n", &arr);printf("%p\n", &arr+1);return 0;
}
分析
其實&arr和arr,雖然值是一樣的,但是意義不一樣。
實際上: arr表示的首元素的地址,arr+1跳過的是第一個元素,所以是4個字節(jié)
&arr 表示的是數(shù)組的地址,而不是數(shù)組首元素的地址。
數(shù)組的地址+1,跳過的是整個數(shù)組的大小,所以 &arr+1 相對于 &arr 的差值是40
3.3 數(shù)組指針的使用
既然數(shù)組指針指向的是數(shù)組,那數(shù)組指針中存放的應該是數(shù)組的地址。
3.3.1 使用實例1
#include<stdio.h>
int main()
{int arr[9] = { 1,2,3,4,5,6,7,8,9 };int(*p)[9] = &arr;;//把數(shù)組arr的地址賦值給數(shù)組指針變量p//但是我們一般很少這樣寫代碼return 0;
}
3.3.2 使用實例2
一維數(shù)組名arr,表示首元素的地址
二維數(shù)組的首元素是二維數(shù)組的第一行
#include <stdio.h>void print1(int arr[3][4], int r, int c)
{int i = 0;for (i = 0; i < r; i++){int j = 0;for (j = 0; j < c; j++){printf("%d ", arr[i][j]);}printf("\n");}
}void print2(int(*p)[4], int r, int c)
{int i = 0;for (i = 0; i < r; i++){int j = 0;for (j = 0; j < c; j++){ //printf("%d ", (*(p + i))[j]);printf("%d ", p[i][j]);}printf("\n");}
}int main()
{int arr[3][4] = { {1,2,3,4}, {2,3,4,5} , {3,4,5,6} };//數(shù)組名arr,表示首元素的地址//但是二維數(shù)組的首元素是二維數(shù)組的第一行//所以這里傳遞的arr,其實相當于第一行的地址,是一維數(shù)組的地址//可以數(shù)組指針來接收//print1(arr, 3, 4);print2(arr, 3, 4);return 0;
}
3.3.3 練習
int arr[5]; //整形數(shù)組,有5個整形元素的 整形數(shù)組arr
int *parr1[10]; //指針數(shù)組,有10個整形指針元素的 整形指針數(shù)組parr1
int (*parr2)[10];//數(shù)組指針 ,指向int型的[10]個元素的數(shù)組 的數(shù)組指針parr2
int (*parr3[10])[5];//parr3是數(shù)組,數(shù)字有10個元素,數(shù)組的每個元素類型是:int(*)[5]的數(shù)組指針類型。
int (*parr3[10])[5];分析