يمكننا إجراء عمليات حسابية على المؤشرات مثل الجمع والطرح وما إلى ذلك. ومع ذلك، بما أننا نعلم أن المؤشر يحتوي على العنوان، فإن نتيجة العملية الحسابية التي يتم إجراؤها على المؤشر ستكون أيضًا مؤشرًا إذا كان المعامل الآخر من النوع الصحيح. في عملية الطرح من المؤشر إلى المؤشر، ستكون النتيجة قيمة عددية. العمليات الحسابية التالية ممكنة على المؤشر في لغة C:
- زيادة راتب
- إنقاص
- إضافة
- الطرح
- مقارنة
زيادة المؤشر في C
إذا قمنا بزيادة المؤشر بمقدار 1، فسيبدأ المؤشر في الإشارة إلى الموقع التالي المباشر. يختلف هذا إلى حد ما عن الحساب العام نظرًا لأن قيمة المؤشر ستزداد حسب حجم نوع البيانات الذي يشير إليه المؤشر.
يمكننا اجتياز مصفوفة باستخدام عملية الزيادة على المؤشر الذي سيستمر في الإشارة إلى كل عنصر في المصفوفة، وإجراء بعض العمليات عليه، وتحديث نفسه في حلقة.
قاعدة زيادة المؤشر موضحة أدناه:
c++ int إلى السلسلة
new_address= current_address + i * size_of(data type)
حيث i هو الرقم الذي يزداد به المؤشر.
32 بت
بالنسبة للمتغير int ذو 32 بت، سيتم زيادته بمقدار 2 بايت.
64 بت
بالنسبة للمتغير int ذو 64 بت، سيتم زيادته بمقدار 4 بايت.
دعونا نرى مثالاً لمتغير المؤشر المتزايد على بنية 64 بت.
#include int main(){ int number=50; int *p;//pointer to int p=&number;//stores the address of number variable printf('Address of p variable is %u ',p); p=p+1; printf('After increment: Address of p variable is %u ',p); // in our case, p will get incremented by 4 bytes. return 0; }
انتاج |
حظ سعيد
Address of p variable is 3214864300 After increment: Address of p variable is 3214864304
اجتياز مصفوفة باستخدام المؤشر
#include void main () { int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; int i; printf('printing array elements... '); for(i = 0; i<5; i++) { printf('%d ',*(p+i)); } < pre> <p> <strong>Output</strong> </p> <pre> printing array elements... 1 2 3 4 5 </pre> <h2>Decrementing Pointer in C</h2> <p>Like increment, we can decrement a pointer variable. If we decrement a pointer, it will start pointing to the previous location. The formula of decrementing the pointer is given below:</p> <pre> new_address= current_address - i * size_of(data type) </pre> <h3>32-bit</h3> <p>For 32-bit int variable, it will be decremented by 2 bytes.</p> <h3>64-bit</h3> <p>For 64-bit int variable, it will be decremented by 4 bytes.</p> <p>Let's see the example of decrementing pointer variable on 64-bit OS.</p> <pre> #include void main(){ int number=50; int *p;//pointer to int p=&number;//stores the address of number variable printf('Address of p variable is %u ',p); p=p-1; printf('After decrement: Address of p variable is %u ',p); // P will now point to the immidiate previous location. } </pre> <p> <strong>Output</strong> </p> <pre> Address of p variable is 3214864300 After decrement: Address of p variable is 3214864296 </pre> <h2>C Pointer Addition</h2> <p>We can add a value to the pointer variable. The formula of adding value to pointer is given below:</p> <pre> new_address= current_address + (number * size_of(data type)) </pre> <h3>32-bit</h3> <p>For 32-bit int variable, it will add 2 * number.</p> <h3>64-bit</h3> <p>For 64-bit int variable, it will add 4 * number.</p> <p>Let's see the example of adding value to pointer variable on 64-bit architecture.</p> <pre> #include int main(){ int number=50; int *p;//pointer to int p=&number;//stores the address of number variable printf('Address of p variable is %u ',p); p=p+3; //adding 3 to pointer variable printf('After adding 3: Address of p variable is %u ',p); return 0; } </pre> <p> <strong>Output</strong> </p> <pre> Address of p variable is 3214864300 After adding 3: Address of p variable is 3214864312 </pre> <p>As you can see, the address of p is 3214864300. But after adding 3 with p variable, it is 3214864312, i.e., 4*3=12 increment. Since we are using 64-bit architecture, it increments 12. But if we were using 32-bit architecture, it was incrementing to 6 only, i.e., 2*3=6. As integer value occupies 2-byte memory in 32-bit OS.</p> <h2>C Pointer Subtraction</h2> <p>Like pointer addition, we can subtract a value from the pointer variable. Subtracting any number from a pointer will give an address. The formula of subtracting value from the pointer variable is given below:</p> <pre> new_address= current_address - (number * size_of(data type)) </pre> <h3>32-bit</h3> <p>For 32-bit int variable, it will subtract 2 * number.</p> <h3>64-bit</h3> <p>For 64-bit int variable, it will subtract 4 * number.</p> <p>Let's see the example of subtracting value from the pointer variable on 64-bit architecture.</p> <pre> #include int main(){ int number=50; int *p;//pointer to int p=&number;//stores the address of number variable printf('Address of p variable is %u ',p); p=p-3; //subtracting 3 from pointer variable printf('After subtracting 3: Address of p variable is %u ',p); return 0; } </pre> <p> <strong>Output</strong> </p> <pre> Address of p variable is 3214864300 After subtracting 3: Address of p variable is 3214864288 </pre> <p>You can see after subtracting 3 from the pointer variable, it is 12 (4*3) less than the previous address value.</p> <p>However, instead of subtracting a number, we can also subtract an address from another address (pointer). This will result in a number. It will not be a simple arithmetic operation, but it will follow the following rule.</p> <p>If two pointers are of the same type,</p> <pre> Address2 - Address1 = (Subtraction of two addresses)/size of data type which pointer points </pre> <p>Consider the following example to subtract one pointer from an another.</p> <pre> #include void main () { int i = 100; int *p = &i; int *temp; temp = p; p = p + 3; printf('Pointer Subtraction: %d - %d = %d',p, temp, p-temp); } </pre> <p> <strong>Output</strong> </p> <pre> Pointer Subtraction: 1030585080 - 1030585068 = 3 </pre> <h2>Illegal arithmetic with pointers</h2> <p>There are various operations which can not be performed on pointers. Since, pointer stores address hence we must ignore the operations which may lead to an illegal address, for example, addition, and multiplication. A list of such operations is given below.</p> <ul> <li>Address + Address = illegal</li> <li>Address * Address = illegal </li> <li>Address % Address = illegal</li> <li>Address / Address = illegal</li> <li>Address & Address = illegal</li> <li>Address ^ Address = illegal</li> <li>Address | Address = illegal</li> <li> ~Address = illegal</li> </ul> <h2>Pointer to function in C</h2> <p>As we discussed in the previous chapter, a pointer can point to a function in C. However, the declaration of the pointer variable must be the same as the function. Consider the following example to make a pointer pointing to the function. <pre> #include int addition (); int main () { int result; int (*ptr)(); ptr = &addition; result = (*ptr)(); printf('The sum is %d',result); } int addition() { int a, b; printf('Enter two numbers?'); scanf('%d %d',&a,&b); return a+b; } </pre> </p><p> <strong>Output</strong> </p> <pre> Enter two numbers?10 15 The sum is 25 </pre> <h2>Pointer to Array of functions in C</h2> <p>To understand the concept of an array of functions, we must understand the array of function. Basically, an array of the function is an array which contains the addresses of functions. In other words, the pointer to an array of functions is a pointer pointing to an array which contains the pointers to the functions. Consider the following example.</p> <pre> #include int show(); int showadd(int); int (*arr[3])(); int (*(*ptr)[3])(); int main () { int result1; arr[0] = show; arr[1] = showadd; ptr = &arr; result1 = (**ptr)(); printf('printing the value returned by show : %d',result1); (*(*ptr+1))(result1); } int show() { int a = 65; return a++; } int showadd(int b) { printf(' Adding 90 to the value returned by show: %d',b+90); } </pre> <p> <strong>Output</strong> </p> <pre> printing the value returned by show : 65 Adding 90 to the value returned by show: 155 </pre> <hr></5;>
انخفاض المؤشر في C
مثل الزيادة، يمكننا إنقاص متغير المؤشر. إذا قمنا بتقليل المؤشر، فسيبدأ في الإشارة إلى الموقع السابق. صيغة تقليل المؤشر موضحة أدناه:
new_address= current_address - i * size_of(data type)
32 بت
بالنسبة للمتغير int ذو 32 بت، سيتم تقليله بمقدار 2 بايت.
64 بت
بالنسبة للمتغير int ذو 64 بت، سيتم تقليله بمقدار 4 بايت.
دعونا نرى مثالاً لمتغير المؤشر المتناقص على نظام التشغيل 64 بت.
#include void main(){ int number=50; int *p;//pointer to int p=&number;//stores the address of number variable printf('Address of p variable is %u ',p); p=p-1; printf('After decrement: Address of p variable is %u ',p); // P will now point to the immidiate previous location. }
انتاج |
Address of p variable is 3214864300 After decrement: Address of p variable is 3214864296
إضافة مؤشر C
يمكننا إضافة قيمة إلى متغير المؤشر. صيغة إضافة قيمة إلى المؤشر موضحة أدناه:
new_address= current_address + (number * size_of(data type))
32 بت
بالنسبة للمتغير int ذو 32 بت، سيتم إضافة 2 * رقم.
64 بت
بالنسبة للمتغير int ذو 64 بت، سيتم إضافة 4 * رقم.
دعونا نرى مثالاً لإضافة قيمة إلى متغير المؤشر على بنية 64 بت.
#include int main(){ int number=50; int *p;//pointer to int p=&number;//stores the address of number variable printf('Address of p variable is %u ',p); p=p+3; //adding 3 to pointer variable printf('After adding 3: Address of p variable is %u ',p); return 0; }
انتاج |
أمريتا راو ممثلة
Address of p variable is 3214864300 After adding 3: Address of p variable is 3214864312
كما ترون، عنوان p هو 3214864300. ولكن بعد إضافة 3 مع متغير p، يصبح 3214864312، أي 4*3=12 زيادة. نظرًا لأننا نستخدم بنية 64 بت، فإنها تزيد بمقدار 12. ولكن إذا كنا نستخدم بنية 32 بت، فستزيد إلى 6 فقط، أي 2*3=6. نظرًا لأن القيمة الصحيحة تشغل ذاكرة 2 بايت في نظام التشغيل 32 بت.
طرح المؤشر C
مثل إضافة المؤشر، يمكننا طرح قيمة من متغير المؤشر. سيؤدي طرح أي رقم من المؤشر إلى إعطاء عنوان. صيغة طرح القيمة من متغير المؤشر موضحة أدناه:
new_address= current_address - (number * size_of(data type))
32 بت
بالنسبة للمتغير int ذو 32 بت، سيتم طرح 2 * رقم.
64 بت
بالنسبة للمتغير int ذو 64 بت، سيتم طرح 4 * رقم.
دعونا نرى مثال طرح القيمة من متغير المؤشر على بنية 64 بت.
#include int main(){ int number=50; int *p;//pointer to int p=&number;//stores the address of number variable printf('Address of p variable is %u ',p); p=p-3; //subtracting 3 from pointer variable printf('After subtracting 3: Address of p variable is %u ',p); return 0; }
انتاج |
Mysql مفتاح فريد
Address of p variable is 3214864300 After subtracting 3: Address of p variable is 3214864288
يمكنك أن ترى بعد طرح 3 من متغير المؤشر، أنها أقل بمقدار 12 (4*3) من قيمة العنوان السابقة.
ومع ذلك، بدلاً من طرح رقم، يمكننا أيضًا طرح عنوان من عنوان آخر (المؤشر). سيؤدي هذا إلى عدد. لن تكون عملية حسابية بسيطة، ولكنها ستتبع القاعدة التالية.
إذا كان هناك مؤشران من نفس النوع،
Address2 - Address1 = (Subtraction of two addresses)/size of data type which pointer points
خذ بعين الاعتبار المثال التالي لطرح مؤشر واحد من آخر.
#include void main () { int i = 100; int *p = &i; int *temp; temp = p; p = p + 3; printf('Pointer Subtraction: %d - %d = %d',p, temp, p-temp); }
انتاج |
Pointer Subtraction: 1030585080 - 1030585068 = 3
الحساب غير القانوني مع المؤشرات
هناك العديد من العمليات التي لا يمكن تنفيذها على المؤشرات. وبما أن المؤشر يخزن العناوين، فيجب علينا تجاهل العمليات التي قد تؤدي إلى عنوان غير قانوني، على سبيل المثال، الجمع والضرب. وترد أدناه قائمة بهذه العمليات.
- العنوان + العنوان = غير قانوني
- العنوان * العنوان = غير قانوني
- العنوان % العنوان = غير قانوني
- العنوان / العنوان = غير قانوني
- العنوان والعنوان = غير قانوني
- العنوان ^ العنوان = غير قانوني
- العنوان | العنوان = غير قانوني
- ~العنوان = غير قانوني
المؤشر للعمل في C
كما ناقشنا في الفصل السابق، يمكن أن يشير المؤشر إلى دالة في لغة C. ومع ذلك، يجب أن يكون تعريف متغير المؤشر هو نفس الدالة. خذ بعين الاعتبار المثال التالي لإنشاء مؤشر يشير إلى الدالة.
#include int addition (); int main () { int result; int (*ptr)(); ptr = &addition; result = (*ptr)(); printf('The sum is %d',result); } int addition() { int a, b; printf('Enter two numbers?'); scanf('%d %d',&a,&b); return a+b; }
انتاج |
ما هو برولوج
Enter two numbers?10 15 The sum is 25
مؤشر إلى مجموعة من الوظائف في C
لفهم مفهوم مجموعة من الوظائف، يجب علينا أن نفهم مجموعة من الوظائف. في الأساس، مصفوفة الوظيفة هي مصفوفة تحتوي على عناوين الوظائف. بمعنى آخر، المؤشر إلى مصفوفة من الوظائف هو مؤشر يشير إلى مصفوفة تحتوي على المؤشرات إلى الوظائف. النظر في المثال التالي.
#include int show(); int showadd(int); int (*arr[3])(); int (*(*ptr)[3])(); int main () { int result1; arr[0] = show; arr[1] = showadd; ptr = &arr; result1 = (**ptr)(); printf('printing the value returned by show : %d',result1); (*(*ptr+1))(result1); } int show() { int a = 65; return a++; } int showadd(int b) { printf(' Adding 90 to the value returned by show: %d',b+90); }
انتاج |
printing the value returned by show : 65 Adding 90 to the value returned by show: 155
5;>