有關(guān)做聚合物電池公司的網(wǎng)站什么是網(wǎng)絡(luò)營銷渠道
目錄
19.字符指針變量
???? *定義
???? *簡單說明
???? *如果是字符串
???? *像數(shù)組一樣指定訪問常量字符串的字符
???? *練習(xí)
20.數(shù)組指針變量
???? *定義
???? *格式
???? *例子
????????? 問題1
????????? 問題2
???? *利用指針打印
21.二維數(shù)組傳參的本質(zhì)
???? *回顧
往期推薦
19.字符指針變量
*定義
指向字符的指針變量,用于存儲(chǔ)字符在內(nèi)存中的地址
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{char a = 'm';char* pc = &a;return 0;
}
*簡單說明
x86環(huán)境下,F11逐語句運(yùn)行至return 0;
轉(zhuǎn)到內(nèi)存,輸入&a
輸入&pc
13 fc 6f 00--倒著寫-->00 6f fc 13-->0x006ffc13是a的地址
? ?
*如果是字符串
回憶之前的內(nèi)容
#include <stdio.h>
int main()
{char arr[]="abcdef";char *pc=arr;return 0;
}
arr數(shù)組存儲(chǔ)著字符串,arr是數(shù)組首元素的地址
類比數(shù)組,如果是字符串
#include <stdio.h>
int main()
{char* pc = "abcdef";return 0;
}
x86環(huán)境下,F11逐語句運(yùn)行至return 0;
轉(zhuǎn)到內(nèi)存,輸入&pc
同理倒著寫地址
地址框中輸入0x00f07bcc 就找到了abcdef
?
arr數(shù)組是一段連續(xù)的空間,數(shù)組的內(nèi)容是可以變的,所以常量字符串(char* pc = "abcdef";)(abcdef\0)也是一段連續(xù)的空間,常量字符串的內(nèi)容不可以變(類比const修飾)!
const修飾見38.【C語言】指針(重難點(diǎn))(C)
寫成下方這樣程序會(huì)崩潰會(huì)報(bào)錯(cuò)(寫入權(quán)限訪問沖突):
char* pc = "abcedf";
*pc = "abc";
*像數(shù)組一樣指定訪問常量字符串的字符
printf("%c","abcdef"[2]);
訪問abcdef常量字符串的第二個(gè)字符c
類似于
char arr[]="abcdef";
printf("%c",arr[2]);
同理
printf("%s",pc);
類似于
char arr[]="abcdef";
printf("%s",arr);
*練習(xí)
求輸出結(jié)果
#include <stdio.h>
int main()
{char str1[] = "abc";char str2[] = "abc";const char* str3 = "abc";const char* str4 = "abc";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;
}
分析:上方代碼的==不是比較兩個(gè)字符串的內(nèi)容是否相等!比較字符串相等用的是strcmp函數(shù)
這里比的分別是數(shù)組首元素的地址和常量字符串首字符的地址
雖然兩個(gè)數(shù)組的內(nèi)容一樣,但是abc字符串創(chuàng)建了兩次,str1和str2存儲(chǔ)的數(shù)組的首元素的地址不一樣,所以not same
由于常量字符串具有內(nèi)容不可以變的特點(diǎn),因此abc沒有必要?jiǎng)?chuàng)建兩次所以str3和str4是same
下面調(diào)用內(nèi)存說明
x86環(huán)境下,F11逐語句運(yùn)行至return 0;
輸入&str1
輸入&str2
輸入&str3
輸入&str4
&str3和&str4都是cc 7b fa 00 ,指向地址0x00fa7bcc
20.數(shù)組指針變量?
?*定義
類比字符指針變量的定義,數(shù)組指針變量存放的是數(shù)組指針(地址)
*格式
?? 數(shù)據(jù)類型 (*指針變量名稱)[數(shù)組元素個(gè)數(shù)]=&數(shù)組名
*例子
問題1:以下代碼運(yùn)行是否有錯(cuò)誤?
#include <stdio.h>
int main()
{int arr1[5] = { 1,2,3,4,5 };int* p1 = &arr1;int arr2[5]={ 0 };int *p2[5] = &arr2;int arr3[5]={ 0 };int (*p3)[5] = &arr3;int arr4[5]={ 0 };int* (*p4)[5] = &arr4;return 0;
}
分析:p2的定義出了問題 ,由操作符運(yùn)算優(yōu)先級(見15.25【C語言】操作符的屬性)可知:*p2[5]代表數(shù)組,不能為數(shù)組賦值&arr
[ ]的優(yōu)先級要高于*號(hào)的,所以必須加上()來保證p先和*結(jié)合,表明p2是指向數(shù)組的指針變量(即數(shù)組指針變量),也就是定義p3的寫法
問題2:p1,p3,p4的定義有什么區(qū)別
去除int *p2[5]=&arr;這一行后打開調(diào)試模式,x86環(huán)境下,F11逐語句運(yùn)行至return 0;
監(jiān)視arr,p1,p3,p4
打開內(nèi)存
輸入&p1
輸入&p3
輸入&p4
顯然p1是整型指針,p3是數(shù)組指針(指向整個(gè)含5個(gè)int元素的數(shù)組的指針),p4是數(shù)組指針(指向含5個(gè)int*指針的數(shù)組的指針)
*利用指針打印
p-->&arr
*p-->*&arr即arr
21.二維數(shù)組傳參的本質(zhì)
*回顧
見13.5.【C語言】二維數(shù)組
*打印
寫法1:實(shí)參,形參全是二維數(shù)組
#include <stdio.h>
void test(int a[3][5], int r, int c)
{int i = 0;int j = 0;for(i=0; i<r; i++){for(j=0; j<c; j++){printf("%d ", a[i][j]);}printf("\n");}
}int main()
{int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7}};test(arr, 3, 5);return 0;
}
寫法2:指針
回顧:一維數(shù)組的數(shù)組名是首元素(單個(gè),“0”維數(shù)組)的地址,可以推出:二維數(shù)組的數(shù)組名是首元素(第一行一維數(shù)組)的地址,同理三維數(shù)組的數(shù)組名是首元素(二維數(shù)組)的地址
所以可以用指針訪問
對上方代碼略加改動(dòng)
#include <stdio.h>
void test(int (*p)[5], int r, int c)
{int i = 0;int j = 0;for (i = 0; i < r; i++){for (j = 0; j < c; j++){printf("%d ", p[i][j]);}printf("\n");}
}int main()
{int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };test(arr, 3, 5);return 0;
}
打印時(shí)p[i][j]有別的寫法
如?? *(p+i)[j],*(*(p+i)+j)
總結(jié):二維數(shù)組傳參的本質(zhì):傳遞了地址,傳遞的是第一行這個(gè)一維數(shù)組的地址
往期推薦
19.【C語言】指針(重難點(diǎn))(A)
37.【C語言】指針(重難點(diǎn))(B)
38.【C語言】指針(重難點(diǎn))(C)
39.【C語言】指針(重難點(diǎn))(D)
40.【C語言】指針(重難點(diǎn))(E)
43.【C語言】指針(重難點(diǎn))(F)